Я хотел бы установить пользовательские разрешения с помощью django guardian в моих представлениях рамки django rest. Я успешно достиг этого для RetrieveModelMixin
, но не для ListModelMixin
.Пользовательские разрешения Django rest framework запросов
У меня есть класс разрешения, глядя, как это:
class CustomPerm(permissions.BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_authenticated()
def has_object_permission(self, request, view, object):
if request.method == 'GET':
if object.public is True:
return True
if object.user.is_staff is True:
return True
if 'read_object' in get_perms(request.user, object):
return True
return False
if request.method == 'POST':
#...
Я также упростил вид здесь:
@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication,))
@permission_classes((CustomPerm,))
class ObjectView(ListModelMixin,
RetrieveModelMixin,
viewsets.GenericViewSet):
queryset = myObject.objects.all()
serializer_class = ObjectSerializer
Поведение Я naïvly ожидающее: ListModelMixin
может фильтровать по себе объекты в соответствии с CustomPerm has_object_permission
правил.
Но это не работает. Я могу сделать то, что хочу, написав метод get_queryset
и применяя мои пользовательские правила разрешения, но это кажется неуместным и ужасным.
Есть ли лучший способ? Спасибо :)
PS: Я уверен, что у меня что-то не хватает, и мой вопрос наивен, но я не вижу, что.
Я реализовал решение на основе фильтров и которое использует разрешения, как вы описали, и это то, что мне нужно. У меня просто возникла проблема с семантикой разрешения, но теперь все в порядке. Thx вы оба :) – J1bz
Рад это слышать! Удачи! – Roba