django - Django Rest Framework 在一个 api 端点中组合多个查询集
问题描述
如何连接特定模型列表的输出,其实例由不同字段过滤?例如,我有一个 Places 模型和两个不同的 url。一种是显示整个列表,另一种是只显示 new_place = True 的实例。使用 django-filter 做一个 API。
模型.py
class Places(models.Model):
main_photo = models.ImageField(upload_to = 'album/')
place = models.CharField(max_length=100)
new_place = models.BooleanField(default = True)
editor_choice = models.BooleanField(default = False, verbose_name = "Editors choice")
most_popular = models.BooleanField(default = False, verbose_name = "Most popular")
序列化程序.py
class PlaceSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name='places_api:detail',
lookup_field='pk'
)
class Meta:
model = Places
fields = (
'url',
'id',
'main_photo',
'name',
'new_place',
'most_popular',
'editor_choice',
)
full_list_views.py
class PlacesListAPIView(ListAPIView):
queryset = Places.objects.all()
serializer_class = PlaceSerializer
new_places_views.py
class PlacesNewListAPIView(ListAPIView):
queryset = Places.objects.all()
serializer_class = PlaceSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('new_place',)
网址.py
url(r'^new/$', views.PlacesNewListAPIView.as_view(), name = 'list_new'),
url(r'^$', views.PlacesListAPIView.as_view(), name = 'place_list'),
这一切都适用于不同的网址。但是我应该怎么做才能将两个列表都放在一页上。页面顶部的新列表和页面底部的完整列表?
解决方案
你可以做这样的事情。用于QuerySet.union()
合并多个查询集。
此示例不支持分页。我怀疑如果您需要分页,您将不得不编写一个自定义分页类。
class MultiFilterPlacesListView(ListAPIView):
"""Custom queryset api view. Does not implement pagination"""
pagination_class = None
queryset = Places.objects.all()
slice_size = 10 # count limit for each of the source queries
def get_queryset(self):
"""Combine queries from new, editor choice and popular"""
new_qs = self.queryset.filter(new_place=True)[:self.slice_size]
editor_qs = self.queryset.filter(editor_choice=True)[:self.slice_size]
popular_qs = self.queryset.filter(popular=True)[:self.slice_size]
return new_qs.union(editor_qs, popular_qs, all=True)
推荐阅读
- java - 上传到 s3 之前的视频和图像压缩
- mysql - pandas to sql raise mysql raise errorclass(errno, errval)
- python - 我如何绘制浮动列表
- go - SQLMock - 模拟出链式 DELETE 查询
- c# - 如何在不需要文本框的情况下从我的视图模型中使用条形码阅读器获取条形码的值?wpf c#
- python - 通过以下链接从新站点刮取数据
- oauth-2.0 - 在 OpenID 连接授权代码流中使用 PKCE 时我们需要 client_secret 吗?
- python - Python列表json转换为列表
- excel - 使用 excel 中的拖动功能以逗号分隔和顺序增加单元格中的数字
- c - 权重偏左树中的融合操作