Как изменить разрешение на основе request.query_params в Django rest frameworks?

Я объединил два представления, которые делают почти одно и то же, за исключением разрешения, я хочу изменить разрешение на основе: если company id находится в параметрах. Если нет, то использовался бы простой класс IsAuthenticated и также создавалось разрешение для IsCompany.

class FilesView(ListAPIView):
    serializer_class = FileSerializer
    permission_classes = (IsAuthenticated,)
    ...
    
    def get_queryset(self):
        if 'company' in self.request.query_params:
            # In this case I want the IsCompany Permission class
            return get_company_files(self)
        # Otherwise the regular one
        return get_personal_files(self)

Смотрите настраиваемые разрешения в документации DRF.

Небольшой пример:

from rest_framework import permissions

class IsCompanyRequestBasedPermission(permissions.BasePermission):
    message = '<description of your permission>'

    def has_permission(self, request, view):
        if 'company' in self.request.query_params:
            # Make your decision. 

И затем добавьте его в permission_classes. Это будет работать так, как вы ожидаете.

Если вы используете

class FilesView(ModelViewSet):

вместо

class FilesView(ListAPIView)

вы можете использовать метод get_serializer_class, который может вам помочь. Например

def get_serializer_class(self):
    if "your statement":
        return "FirstSerializer"
    if "your statement":
        return "SecondSerializer"
Вернуться на верх