【问题标题】:DRF - Paginated response - append list of all idsDRF - 分页响应 - 附加所有 id 的列表
【发布时间】:2021-02-13 00:24:06
【问题描述】:

我的网站上有“下一个对象”功能,但我使用分页。我想添加“ids”字段,其中包含过滤并排序到分页响应中的所有对象的 id。

我尝试的所有内容都只返回当前页面 id 的列表。

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 20


    def get_paginated_response(self, data, list_of_ids):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('results', data),
            ('ids', list_of_ids)
        ]))

    


class RealestateViewSet(ModelViewSet):
    ...
    pagination_class = StandardResultsSetPagination

    def get_paginated_response(self, data, list_of_ids):
        """
        Return a paginated style `Response` object for the given output data.
        """
        assert self.paginator is not None
        return self.paginator.get_paginated_response(data, list_of_ids)

    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, list(queryset.values_list('id', flat=True)))

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

这将返回一个包含 20 个 ID 的列表,而不是所有过滤后的对象 ID。

你知道怎么做吗?

【问题讨论】:

    标签: python django django-rest-framework django-queryset


    【解决方案1】:

    您可以通过提供 ids 子类 BaseFilterBackend 来过滤查询集(来自 get_queryset()),然后将子类附加到 ModelViewSet.filter_backends

    不清楚您的问题中您的ids 来自哪里(来自URL 参数?例如http://your_url?param1=value1),但一个简单的例子可能是这样的:

    from rest_framework.filters import BaseFilterBackend
    
    class LimitQsetFilter(BaseFilterBackend):
        def filter_queryset(self, request, queryset, view):
            ids = [1,2,3,4]
            queryset = queryset.filter(pk__in=ids)
            return queryset
    
    class RealestateViewSet(ModelViewSet):
        ...
        filter_backends = [LimitQsetFilter,]
        ...
    
    

    然后您将在分页上看到过滤的对象实例列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2021-12-20
      • 2015-03-16
      • 2019-04-30
      • 2020-10-20
      • 2022-08-07
      • 1970-01-01
      相关资源
      最近更新 更多