2016-07-22 168 views
3

我有一个链接使用两条Django模型:如何在Django REST框架中为POST请求设置权限?

class ParentModel(models.Model): 
    creator = models.ForeignKey(User, related_name='objects') 
    name = models.CharField(max_length=40) 

class ChildModel(models.Model): 
    parent = models.ForeignKey(ParentModel, related_name='child_objects') 
    name = models.CharField(max_length=40) 

现在,儿童模型制作视图集中的时候,我想它,如果它的父被认为是创造相同的用户创建仅创建子实例。那我包括在我的ChildViewSet(viewsets.ModelViewSet)权限类看起来是这样的:

class IsOwner(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     if request.method in permissions.SAFE_METHODS: 
      return True 
     return obj.parent.creator == request.user 

这似乎只是正常工作当我使用PATCH方法,但似乎POST方法不当时我明确地察觉这种权限类POST方法设置return False

我在做什么错误,以及如何解决它?

回答

0

很难知道肯定没有看到你的网址和意见,但请看看BasePermission实现的默认方法,你继承:

def has_permission(self, request, view): 
    """ 
    Return `True` if permission is granted, `False` otherwise. 
    """ 
    return True 

def has_object_permission(self, request, view, obj): 
    """ 
    Return `True` if permission is granted, `False` otherwise. 
    """ 
    return True 

对于PATCH你与已经存在的对象工作,然后进入已覆盖的自定义方法 - 确定!对于POST,您可能会挂钩到另一个,因为您正在创建一个新对象。

因此,请在您的派生类中尝试执行has_permission

1

感谢wim为我提供了一个答案的提示!

我的权限没有与POST请求一起工作的原因实际上是该对象尚未创建,所以我应该在我的权限类中使用has_permission。这里是代码为我工作:

def has_permission(self, request, view): 
    user_id = getattr(request.user, 'id') 
    parent_id = request.data['parent'] 
    if parent_id is not None: 
     parent_obj = ParentModel.objects.get(id=parent_id) 
     serialized = ParentSerializer(association) 
     return user_id == serialized.data['creator'] 
    return False 
+0

感谢您的支持!我设法调整了我正在做的事情。 – whoisearth