Как прочитать значения строки запроса в логике ModelViewSet?

Мне нужно получить значения строки запроса в некоторой логике набора представлений (в данном случае производной от ModelViewSet). Все, что я читал, включая документацию Django REST Framework, говорит, что request является атрибутом набора представлений. Но когда я действительно пытаюсь сослаться на него в коде, независимо от того, как я это делаю, мне выдается ошибка времени выполнения у объекта 'AddressViewSet' нет атрибута 'request'. Вот одна упрощенная версия определения класса, которая вызывает ошибку:

class AddressViewSet(viewsets.ModelViewSet):
    def __init__(self, suffix, basename, detail):
        attendee = ""
        if self.request.query_params.get('attendee'):
            attendee = self.request.query_params.get('attendee')

        self.serializer_class = AddressSerializer
        self.queryset = Address.objects.all()

Как читать свойства request в логике набора представлений в DRF?

Я не понял, что можно переопределить функцию get_queryset(), но при этом вы не присваиваете queryset напрямую - это происходит автоматически. После вызова этой переопределенной функции запрос request становится доступным как свойство набора представлений, поэтому на него можно ссылаться.

Вы переопределяете неправильный метод. ViewSet, как и все представления на основе классов в Django (Все представления DRF наследуются от django.views.generic.View), инстанцируется (Шаблон, обычно видимый как View.as_view(), внутренне создает экземпляр класса) еще до получения запроса. Этот экземпляр используется в шаблонах url, и когда запрос, соответствующий шаблону url, найден, вызывается динамически созданная функция для представления, которая затем вызывает dispatch.

Возвращаясь к сути __init__ не является правильным методом для переопределения, если вы хотите фильтровать набор запросов, вы должны переопределить get_queryset:

class AddressViewSet(viewsets.ModelViewSet):
    queryset = Address.objects.all()
    serializer_class = AddressSerializer

    def get_queryset(self):
        queryset = super().get_queryset()
        attendee = ""
        if self.request.query_params.get('attendee'):
            attendee = self.request.query_params.get('attendee')
        # Filter queryset here
        return queryset
Вернуться на верх