Представление Django пропускает проверку классов разрешений

Я пытаюсь отфильтровать списки в соответствии с:

  • пользователь может работать со всеми своими списками
  • пользователь может использовать безопасные методы в публичных списках

У меня такой код:

В views.py:

class LinkListViewSet(viewsets.ModelViewSet,
                  generics.ListAPIView,
                  generics.RetrieveAPIView):
queryset = LinkList.objects.all()
serializer_class = LinkListSerializer
permission_classes = [IsOwnerOrPublic]

В файле permissions.py:

class IsOwnerOrPublic(BasePermission):
def has_permission(self, request, view):
    return request.user and request.user.is_authenticated

def has_object_permission(self, request, view, obj):
    return obj.owner == request.user or (
        obj.public and (request.method in SAFE_METHODS))

Проблема в том, что я считаю, что представление просто пропускает проверку классов разрешений и возвращает все списки, и я не уверен, почему, или как это исправить.

Он будет проверять has_object_permission только для запросов, которые работают с объектом, поэтому, например, RetrieveAPIView, а не ListAPIView.

Вы должны фильтровать для последнего, чтобы мы могли сделать пользовательский IsOwnerOrPublicFilterBackend бэкенд фильтра:

from django.db.models import Q
from rest_framework import filters

class IsOwnerOrPublicFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(Q(owner=request.user) | Q(public=True))

и затем использовать этот фильтр как filter_backend в ModelViewSet:

class LinkListViewSet(viewsets.ModelViewSet):
    queryset = LinkList.objects.all()
    serializer_class = LinkListSerializer
    filter_backends = [IsOwnerOrPublicFilterBackend]
    permission_classes = [IsOwnerOrPublic]
Вернуться на верх