我有两个像这样链接的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}}方法。
我做错了什么以及如何解决?
答案 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
。