试图将对象编辑限制为对象';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,您的模型中需要一个指向创建者/所有者的字段


更多信息

好吧,现在我很困惑。那太容易了。那么为什么我需要编写自定义权限?用于高级筛选。例如,如果您必须控制用户在创建涉及蔬菜的收据时是否具有“添加蔬菜”权限(只是为了说点什么)。