我想在我的API中显示分页功能,并且我正在将APIView
与多个序列化程序一起使用。
我知道用ListView
显示分页非常容易。
我在某个地方见过组合ListModelMixin
和{
class ListModelMixin(object):
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)
serializer = self.get_serializer(queryset, many=True)
return Response(serilaizer.data)
class ItemsAPIView(APIView):
permission_classes = (permissions.IsAuthenticated,)
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
def get(self, request, format=None):
"""
Return a list of all devices of this user.
"""
reply = {}
try:
products = BaseItem.objects.owned_items().filter(owner=request.user)
reply['data'] = OwnedItemSerializer(products, many=True).data
items = BaseItem.objects.dev_items().filter(owner=request.user)
reply['data'].extend(ItemSerializer(items, many=True).data)
except:
reply['data'] = []
return Response(reply, status.HTTP_200_OK)
如何将它们组合在一起,以便获得分页结果?
提前谢谢!在
首先,你现在做的事情太复杂了,没有理由。在
为了实现“paginatable”查询集,最好在简单的过滤器组合中更改},而不是模型方法。举例说明:
owned_items()
和{而不是
^{pr2}$这样,您就可以生成一个更容易分页的查询集:
注意1:如果你愿意,你可以进一步简化事情,但这超出了你的问题范围。作为思考的食粮,看看这个:
注意2:您应该为单个模型使用一个序列化程序,因为您所做的增加了复杂性而没有好处(高风险低回报的情况)
基于上述假设:
这里有一些方法可以实现您的目标:
通过使用GeneriAPIView和ListModelMixin,您可以重构类,使{}方法具有自动分页功能:
如果您不想使用上述方法,并且希望保留您的
APIView
,那么您可以保留您的get
方法并为其提供分页,如Q&A example所述:相关问题 更多 >
编程相关推荐