And*_*uiz 3 django django-rest-framework
我在 django 休息框架中有一个 CRUD 并控制我使用权限类的权限。这是我为 CRUD 创建的权限类。这对于更新和删除非常有效:
class LinkAssetPermission(permissions.BasePermission):
message = 'Link access not allowed.'
def has_object_permission(self, request, view, obj):
return obj.content.delivery.owner == request.user and obj.content.delivery.can_change
Run Code Online (Sandbox Code Playgroud)
如果这个类不适用于我的创建视图,我的问题是:
class AssetCreate(generics.CreateAPIView):
"""
Link a new asset
"""
queryset = Asset.objects.none()
serializer_class = AssetSerializer
permission_classes = (permissions.DjangoModelPermissions, LinkAssetPermission, )
Run Code Online (Sandbox Code Playgroud)
当obj.content.delivery.can_change返回 false 时,我无法创建、更新或删除模型对象。对于 也一样obj.content.delivery.owner == request.user。只有当用户是所有者时我才能创建、更新或删除。所有这一切都按照我想要的更新和删除的方式工作,只是为了创建它不起作用。可能是因为我还没有对象,这就是我问题的核心。
该对象在创建时存在,我也尝试过return False,has_object_permission但仍然可以创建记录。
我应该为插入创建一个新的权限类还是应该更改我的视图中的某些内容?
谢谢你的帮助
我发现我必须做什么。这是我的新权限类别:
class LinkAssetPermission(permissions.BasePermission):
message = 'Link access not allowed.'
def has_permission(self, request, view):
try:
content = Content.objects.get(pk=request.parser_context["kwargs"]["content_id"])
except:
return False
return content.delivery.owner == request.user and content.delivery.can_change
def has_object_permission(self, request, view, obj):
return obj.content.delivery.owner == request.user and obj.content.delivery.can_change
Run Code Online (Sandbox Code Playgroud)
创建时不考虑 has_object_permission 方法,但会考虑 has_permission。所以我检索从 urls.py 发送的参数,查询并检查我想要的对象的属性。
谢谢
| 归档时间: |
|
| 查看次数: |
4546 次 |
| 最近记录: |