如何在Django REST Framework中为POST请求设置权限?

时间:2016-07-22 14:51:29

标签: python django django-rest-framework

我有两个像这样链接的Django模型:

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)

现在,在为子模型创建ViewSet时,我希望仅在其父项由创建子实例的同一用户创建时才创建它。我在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方法似乎没有注意到此权限类,即使我为{{明确设置return False也是如此1}}方法。

我做错了什么以及如何解决?

2 个答案:

答案 0 :(得分:2)

感谢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

答案 1 :(得分:1)

如果没有看到您的网址和观看次数,很难确定,但请查看您继承的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