1

Я хотел бы установить пользовательские разрешения с помощью 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: Я уверен, что у меня что-то не хватает, и мой вопрос наивен, но я не вижу, что.

ответ

1

Я боюсь, что рамки не работает так ... Разрешения там, чтобы запретить доступ (когда выполняется условие), но не фильтровать объекты для вас. Если вам нужно вернуть определенные объекты, тогда вам нужно отфильтровать их в представлении (queryset) в зависимости от текущего пользователя, если это необходимо.

+0

Я реализовал решение на основе фильтров и которое использует разрешения, как вы описали, и это то, что мне нужно. У меня просто возникла проблема с семантикой разрешения, но теперь все в порядке. Thx вы оба :) – J1bz

+0

Рад это слышать! Удачи! – Roba

0

Ну, переопределение не ужасно, в зависимости от того, как вы это делаете ... но это не вопрос.

Если я хорошо понимаю, что вы хотите сделать, это отфильтровать запрос, используя ваше собственное разрешение.

То, что я рекомендую, чтобы сохранить ваш код явно и просто, переопределить бэкэнд фильтр, как в doc

Но будьте осторожны filter_queryset применяются на обоих retrieve и list методов

Смежные вопросы