DRF - 分页响应 - 附加所有 id 的列表
Posted
技术标签:
【中文标题】DRF - 分页响应 - 附加所有 id 的列表【英文标题】:DRF - Paginated response - append list of all ids 【发布时间】: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。
你知道怎么做吗?
【问题讨论】:
【参考方案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,]
...
然后您将在分页上看到过滤的对象实例列表。
【讨论】:
以上是关于DRF - 分页响应 - 附加所有 id 的列表的主要内容,如果未能解决你的问题,请参考以下文章