私はdjango-rest-frameworkを使って、安らかなプロジェクトでdjango-guardianを使ってオブジェクトのアクセス許可を管理したいと思います。私が望む何django-guardianとdjango-rest-framework
:彼は 「add_modelname」権限を持っている場合にのみ
- は、接続されているユーザーがオブジェクトを作成することができます。
- 接続されたユーザーがオブジェクトを作成するときは、「delete_modelname」 と「change_modelname」のアクセス許可を設定します。
- 「change_modelobject」権限がある場合にのみ、接続されたユーザーがオブジェクトを編集できるようにします。
- 「delete_modelobject」権限がある場合のみ、接続されたユーザーがオブジェクトを削除できるようにします。
私はこのコードでthoses例を管理しようとしている:
view.py
class ModelNameViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
queryset = ModelName.objects.all()
serializer_class = ModelNameSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, ModelNamePermission)
def create(self, request, *args, **kwargs):
assign_perm("change_modelname", request.user, self)
assign_perm("delete_modelname", request.user, self)
return super().create(request, *args, **kwargs)
class ModelNamePermission(permissions.BasePermission):
"""
Custom permission to only allow owners of an object to edit it.
"""
def has_permission(self, request, view):
if request.method in ['GET']:
return request.user.has_perm('view_modelname')
if request.method in ['POST']:
return request.user.has_perm('add_modelname')
if request.method in ['PUT', 'PATCH']:
return request.user.has_perm('change_modelname')
if request.method in ['DELETE']:
return request.user.has_perm('delete_modelname')
return False
def has_object_permission(self, request, view, obj):
if request.method in ['GET']:
return request.user.has_perm('view_modelname', obj)
if request.method in ['POST']:
return request.user.has_perm('add_modelname', obj)
if request.method in ['PUT', 'PATCH']:
return request.user.has_perm('change_modelname', obj)
if request.method in ['DELETE']:
return request.user.has_perm('delete_modelname', obj)
return False
permissions.py私が遭遇した最初の問題は、Iこの行にエラーがあります:
assign_perm("change_modelname", request.user, self)
エラー:
error: 'ModelNameViewSet' object has no attribute '_meta'
そして私は、コードの残りの部分はなりません作品だと思いますが、少なくとも私が何をしたいのかを見ることができます。
具体的なケースについては例を見ていません。
編集:
request.user.has_perm('view_coachingrequest')
オールウェイズtrueを返します: もう一つは、このコードはということです。しかし、私は自分のユーザーにこのアクセス許可を設定していません(管理者のみで試してみました。おそらくそれが理由です)。
私はまったく同じことをしたいと思います。あなたはそれをやりましたか? – BaptWaels