尝试在Django Rest Framework中将对象的编辑限制为对象的所有者或is_staff

时间:2014-07-02 19:34:10

标签: 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

    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,并且对非员工用户有权限控制。但是,除了查看它之外,NOT工作人员用户无法在自己的记录上做任何事情。

我认为if request.method in SAFE_METHODS允许通过,但我似乎错过了一些东西。

建议欢迎。

顺便说一句:我希望user.is_staff能够做任何事情和一个非工作人员只能在他们的OWN记录上进行GET / PUT / PATCH / POST。

谢谢!

1 个答案:

答案 0 :(得分:1)

它比你正在尝试的更容易。覆盖视图的get_queryset方法:


    if self.request.user.is_superuser:
       return Model.objects.all()
    else:
       return Model.objects.filter(owner=self.request.user)

ofc,您需要模型中指向创建者/所有者的字段。

更多信息Django-rest-framework permissions for create in viewset