试图将对象编辑限制为对象';Django Rest框架中的所有者或is_员工
我快到了,但我不能完全理解 我有一个自定义权限设置:试图将对象编辑限制为对象';Django Rest框架中的所有者或is_员工,django,django-rest-framework,Django,Django Rest Framework,我快到了,但我不能完全理解 我有一个自定义权限设置: from rest_framework.permissions import BasePermission, SAFE_METHODS class IsOwnerOrStaff(BasePermission): def has_permission(self, request, view): return view.action == 'retrieve' or request.user.is_staff
from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsOwnerOrStaff(BasePermission):
def has_permission(self, request, view):
return view.action == 'retrieve' or request.user.is_staff
def has_object_permission(self, request, view, obj):
if request.method in SAFE_METHODS:
return True
return request.user.is_staff or obj == request.user
以及执行此操作的用户视图:
from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework import permissions
from .serializers import UserSerializer
from .permissions import IsOwnerOrStaff
class ViewMixins(object):
permission_classes = (permissions.IsAuthenticated, IsOwnerOrStaff,)
class UserViewSet(ViewMixins, viewsets.ModelViewSet):
serializer_class = UserSerializer
model = User
当request.user.is_staff
时,所有操作都有效,并且对非staff用户有权限控制。但是,非工作人员用户除了查看记录外,不能对自己的记录执行任何操作
我认为SAFE_方法中的if request.method会允许它通过,但我似乎遗漏了一些东西
欢迎提出建议
顺便说一句:我希望一个user.is_员工能够做任何事情,而一个非员工的用户只能获取/放置/修补/发布他们自己的记录
谢谢 这比你正在尝试的更容易。覆盖视图的get_queryset方法:
if self.request.user.is_superuser:
return Model.objects.all()
else:
return Model.objects.filter(owner=self.request.user)
如果self.request.user.is_superuser:
返回Model.objects.all()
其他:
返回Model.objects.filter(所有者=self.request.user)
ofc,您的模型中需要一个指向创建者/所有者的字段
更多信息好吧,现在我很困惑。那太容易了。那么为什么我需要编写自定义权限?用于高级筛选。例如,如果您必须控制用户在创建涉及蔬菜的收据时是否具有“添加蔬菜”权限(只是为了说点什么)。