Django Rest Framework 在一个 api 端点中组合多个查询集

标签 django django-rest-framework

如何连接特定模型的列表的输出,其实例由不同字段过滤?例如,我有一个 Places 模型和两个不同的 url。在一个中,显示整个列表,在另一个中仅显示 new_place = True 的实例。 使用 django-filter 执行 API。

models.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',)

urls.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)

关于Django Rest Framework 在一个 api 端点中组合多个查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50238862/

相关文章:

javascript - 在模板 DJANGO 中呈现 JSON

python - Django Celery apply_async 不起作用

python - 为 Django/Python 3 配置 Azure

python - 使用 Django Rest Framework 时如何访问请求正文并避免获取 RawPostDataException

django - 在 DRF 和 ReactJS 中实现推送通知

django - 我可以在同一个 url 模式中包含两个不同的 url 吗?示例 [ 路径 ('api/' ,包括 ('quiz.urls' )),路径 ('api/' ,包括 ('user.urls' )) ]

python - Django 添加额外的列进行分组依据

django - 多数据库事务

python - 在 django-rest-framework 中出现数据库验证错误后如何返回状态代码?

django - 如何在 Django Rest Framework (DRF) 中控制版本控制