django - 根据发出请求的域过滤查询集
问题描述
我正在构建一个 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)
预期的结果应该是与通过标头传递的域相对应的数据。过滤(如果应用过滤器)和分页。
解决方案
顾名思义,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].
推荐阅读
- typescript - In typescript, is there a way to ensure that a function's return type is exhaustive?
- algorithm - Unity中很少有物体一个接一个地直线移动
- java - 如何在 Libgdx 的顶部启动滚动窗格而不在顶部填充?
- c# - UWP 的 kernel32.dll 中的 SetThreadExecutionState 模拟
- javascript - 从键盘中断一个功能
- c# - 在 Xamarin Form XAML 页面中,如何将图像的宽度设置为等于屏幕宽度?
- c++ - system() 之后的脚本仅在应用程序预先打开时才有效
- javascript - 我的 Node.js 服务器不断收到错误消息:“__dirname is not defined”
- android - Android wifi p2p 视频聊天应用
- python - Django send_mail 使用 RequestFactory 给出 NoneType 错误,但在视图之外运行代码时没有(包括测试代码)