Понимание прав доступа в Django

Я пытаюсь разобраться с правами доступа в Django. В пунктах ниже я написал, что мне удалось найти по этому вопросу и как я это понимаю. Возможно, кто-то сможет подсказать мне, правильно ли я рассуждаю или это работает по-другому. Буду благодарен за дополнительные статьи на эту тему. Спасибо!

1. APIView со встроенными разрешениями

Django имеет некоторые встроенные разрешения, которые мы можем использовать в APIView через permission_classes.

     class OrderView(APIView):
            permission_classes = [permissions.IsAuthenticated] 

Мы можем добавить следующие встроенные разрешения к классам permission_classes, потому что у них нет has_object_permission:

AllowAny, IsAuthenticated, IsAuthenticatedOrReadOnly, IsAdminUser, DjangoModelPermissions, DjangoModelPermissionsOrAnonReadOnly

2. APIView с пользовательскими разрешениями

Допустим, мы хотим использовать пользовательское разрешение из пункта 1 в APIView. Можем ли мы в этом случае использовать permission_classes?

    class OrderView(APIView):
        permission_classes = [permissions.IsAuthenticatedAndOwner]

Я не знаю, какой объект будет отправлен has_object_permission и как это сделать. Хороший ли это способ?

def has_object_permission(self, request, view, obj): # <-- obj
    return obj.user == request.user

3. APIView с разрешениями check_permissions и check_object_permissions.

Я немного запутался в этих методах. Если я правильно понял, эти методы используются для вызова has_permission и has_object_permission из APIView? Есть ли другая причина для их использования? Используем ли мы их только с APIView?

4. ViewSet с пользовательскими разрешениями

Допустим, мы хотим использовать пользовательское разрешение из пункта 1, но с ViewSet

    class MessageViewSet(viewsets.ModelViewSet):
    
        permission_classes = [IsAuthenticatedAndOwner]
    
        queryset = Message.objects.all()
        serializer_class = MessageSerializer
    
        def perform_create(self, serializer):
            serializer.save(author=self.request.user)

В этом случае что будет отправлено в качестве obj в has_object_permission?

def has_object_permission(self, request, view, obj): # <-- obj
    return obj.user == request.user

Будут ли это данные из queryset?

Вернуться на верх