DRF-分页响应-附加所有ID的列表 [英] DRF - Paginated response - append list of all ids
问题描述
我有一个下一个对象",网站上的功能,但我使用分页.我想添加"ids"包含所有已过滤并排序到分页响应中的所有对象的ID的字段.
I have a "next object" feature on my website but I use pagination. I would like add "ids" field that contains ids of all objects filtered and sorteded into the paginated response.
我尝试的所有操作仅返回当前页面ID的列表.
Everything that I tried returns only a list of current page ids.
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.
This returns a list of 20 ids instead of all filtered objects ids.
你知道怎么做吗?
推荐答案
您可以通过提供ID将 BaseFilterBackend
子类化以过滤查询集(来自 get_queryset()
),然后将该子类附加到 ModelViewSet.filter_backends
.
you can subclass BaseFilterBackend
to filter the queryset (coming from get_queryset()
) by providing the ids , then appending the subclass to ModelViewSet.filter_backends
.
尚不清楚您的 ids
在问题中来自何处(来自URL参数?例如 http://your_url?param1 = value1
),只是一个简单的示例可能是这样的:
It's not clear about where your ids
comes from in your question (from URL parameters ? e.g. http://your_url?param1=value1
), but a quick example may be like this :
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,]
...
然后,您将在分页中看到对象实例的过滤列表.
Then you will see filtered list of object instances on pagination.
这篇关于DRF-分页响应-附加所有ID的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!