首页 > 解决方案 > 根据发出请求的域过滤查询集

问题描述

我正在构建一个 SaaS,它将使用 Django Rest Framework 使用 NextJS(通用反应框架)在前端管理多个网站。

我想根据发出请求的域过滤数据,在前端我通过域的标头发送,在后端我根据域过滤数据,问题是当我尝试返回时我得到以下代码的数据:

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)

预期的结果应该是与通过标头传递的域相对应的数据。过滤(如果应用过滤器)和分页。

标签: djangodjango-rest-frameworkdjango-views

解决方案


顾名思义,qet_queryset[drf-doc]应该返回 a 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']
        return self.queryset.filter(company__domain=domain)

The list(..) function will automatically apply the defined filters [GitHub]:

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

        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)

The (optional) pagination, serialization, and construction of the response are all handled by the ListAPIView [drf-doc] itself. If you want to override how the response is constructed for the given queryset, you should override the list(..) method [classy].


推荐阅读