Отфильтруйте набор запросов по домену, который делает запрос - PullRequest
2 голосов
/ 10 июня 2019

Я создаю SaaS, который будет управлять несколькими веб-сайтами на внешнем интерфейсе с помощью NextJS (универсальной платформы реагирования) с использованием Django Rest Framework.

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

AttributeError: 'Response' object has no attribute 'model'

Вот мой код:

class ListProperties(generics.ListAPIView):
    queryset = models.Property.objects.all()
    serializer_class = frontend.PropertyCard
    filter_class = filters.PropertyFilterset
    pagination_class = pagination.PropertyPageNumberPagination

    def get_queryset(self):
        domain = self.request.META['HTTP_DOMAIN']
        qs = self.filter_queryset(self.queryset.filter(company__domain=domain))
        serialized = self.get_serializer(qs,many=True)
        return Response(serialized.data)

Ожидаемым результатом должны быть данные, которые соответствуют домену, переданному через заголовки. Отфильтрованные (если применяются фильтры) и разбиты на страницы.

1 Ответ

2 голосов
/ 10 июня 2019

Предполагается, что qet_queryset [drf-doc] , как следует из названия, возвращает QuerySet, а не ответ этого набора запросов.Вы должны просто вернуть:

class ListProperties(generics.ListAPIView):
    queryset = models.Property.objects.all()
    serializer_class = frontend.PropertyCard
    filter_class = filters.PropertyFilterset
    pagination_class = pagination.PropertyPageNumberPagination

    def get_queryset(self):
        domain = self.request.META['HTTP_DOMAIN']
        <b>return self.queryset.filter(company__domain=domain)</b>

Функция list(..) автоматически применяет определенные фильтры [GitHub] :

    def list(self, request, *args, **kwargs):
        queryset = <b>self.filter_queryset(</b>self.get_queryset()<b>)</b>

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

(Необязательное) разбиение на страницы, сериализация и построение ответа обрабатываются самим ListAPIView [drf-doc] .Если вы хотите переопределить способ построения ответа для данного набора запросов, вам следует переопределить метод list(..) [classy] .

...