使用API​​-View在Django-Rest-Framework中分页 [英] Pagination in Django-Rest-Framework using API-View

查看:2297
本文介绍了使用API​​-View在Django-Rest-Framework中分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在有一个API视图设置如下:

 类CartView(APIView):
authentication_classes = [ SessionAuthentication,TokenAuthentication]
permission_classes = [IsAuthenticated]
api_view = ['GET','POST']

def get(self,request,format = None):
try:
cart = request.user.cart
除了Cart.DoesNotExist:
cart = Cart.objects.create(user = request.user)
cart_details = cart .cart_details.all()
serializer = CartDetailSerializer(cart_details,many = True,fields = ['id','item','quantity','product_type'])
返回响应(serializer.data )

这里 CartDetailSerializer 是一个普通的ModelSerializer。



我想对这个API进行分页。但是,在DRF的文档中,我发现这一点:


如果您使用常规APIView,则需要调用分页API自己确保您返回分页响应。


没有提供关于如何分页一个常规APIView API的示例。



任何人都可以发布一个我可以在上述情况下使用的示例。



谢谢。

解决方案

使用常规APIView时,需要使用Django自己的Paginator类。



视图中的Django分页



在您的情况下,您可以在发送到序列化程序之前分页queryset。



这样的东西:

  def get(self,request,format = None):
try:
cart = request.user.cart
除了Cart.DoesNotExist:
cart = Cart.objects.create(user = request.user)
cart_details = cart.cart_details.all()

paginator = Paginator(cart_details,10)
page = request.GET.get('page')

try:
cart_details = paginator.page(页面)
除了PageNotAnInteger:
#如果页面不是整数,请提供第一页。
cart_details = paginator.page(1)
除了EmptyPage:
#如果页面超出范围(例如9999),则提供最后一页的结果。
cart_details = paginator.page(paginator.num_pages)
serializer = CartDetailSerializer(cart_details,many = True,fields = ['id','item','quantity','product_type'])
return响应(serializer.data)

希望这有帮助。


I currently have an API view setup as follows:

class CartView(APIView):
authentication_classes = [SessionAuthentication, TokenAuthentication]
permission_classes = [IsAuthenticated, ]
api_view = ['GET', 'POST']

def get(self, request, format=None):
    try:
        cart = request.user.cart
    except Cart.DoesNotExist:
        cart = Cart.objects.create(user=request.user)
    cart_details = cart.cart_details.all()
    serializer = CartDetailSerializer(cart_details, many=True, fields=['id', 'item', 'quantity', 'product_type'])
    return Response(serializer.data)

Here CartDetailSerializer is a normal ModelSerializer.

I want to paginate this API. However, in the docs of DRF, I found this:

If you're using a regular APIView, you'll need to call into the pagination API yourself to ensure you return a paginated response.

There is no example provided on how to paginate a regular APIView API.

Can anyone post an example which I can use in above scenario.

Thanks.

解决方案

When using regular APIView, you need to use Django's own Paginator class.

Django Pagination in Views

In your case you can paginate queryset before sending it to serializer.

Something like this:

def get(self, request, format=None):
    try:
        cart = request.user.cart
    except Cart.DoesNotExist:
        cart = Cart.objects.create(user=request.user)
    cart_details = cart.cart_details.all()

    paginator = Paginator(cart_details, 10)
    page = request.GET.get('page')

    try:
        cart_details = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        cart_details = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        cart_details = paginator.page(paginator.num_pages)
    serializer = CartDetailSerializer(cart_details, many=True, fields=['id', 'item', 'quantity', 'product_type'])
    return Response(serializer.data)

Hope this helps.

这篇关于使用API​​-View在Django-Rest-Framework中分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆