Vue + Django2.0.6 学习笔记 5.6 通过GenericView方式实现商品列表页和分页功能

1. 先说 GenericView:

之前get请求的处理是这么写的:

    def get(self, request, format=None):
        goods = Goods.objects.all()[:10]
        # 因为goods是一个queryset列表对象 所以需要Many=True
        goods_serializer = GoodSerializer(goods, many=True)
        return Response(goods_serializer.data)

嗯。。。感觉代码太长了

那就改:

from rest_framework import mixins
from rest_framework import generics


class GoodsListView(mixins.ListModelMixin, generics.GenericAPIView):
    """
    商品列表页.
    """

    queryset = Goods.objects.all()[:10]
    serializer_class = GoodsSerializer

# 必须重写 否则认为不接受get请求 其他的请求也是
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

嗯。。。能不能不重写那个get函数

能!

先看源码:

rest_framework.generics.ListAPIView



class ListAPIView(mixins.ListModelMixin, GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

很像有没有

那就这样干:

from rest_framework import generics


class GoodsListView(generics.ListAPIView):
    """
    商品列表页.
    """

    queryset = Goods.objects.all()[:10]
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination

好了。 这样就可以了 屌爆了有没有

那现在来说第二个功能:

分页

还要手动分页么? NONONO~~

这样来:

首先先去settings.py中设置下

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

然后。。就可以了。  屌不屌 屌不屌

效果:

当然 这都是默认分页

如果要定制化的话可以这样:

先把settings.py中的那个设置注释掉page_size的字段

class GoodsPagination(PageNumberPagination):
    # 每页显示列数
    page_size = 10
    # 默认每页显示10个, 可以传入?page_size来改变每页的个数
    page_size_query_param = 'page_size'
    # 获取页码数的字段名
    page_query_param = 'p'
    # 每页最大显示列表数量
    max_page_size = 100
class GoodsListView(generics.ListAPIView):
    """
    商品列表页.
    """

    # queryset = Goods.objects.all()[:10]
    # 所有的数据 做分页用
    queryset = Goods.objects.all().order_by('id')
    serializer_class = GoodsSerializer
# 这里要传递类过来
    pagination_class = GoodsPagination

然后就可以了 

这里要注意的是 Django2.0的rest_framework(3.9.2)中的settings.py中的'DEFAULT_PAGINATION_CLASS'的值是None

所以需要在settings.py中自定义添加上去。

还有在使用Goods.objects.all()后进行序列化。有可能会报错Pagination may yield inconsistent results with an unordered object_list

这表示 获取的QuerySet对象列表的数据是无序。所序列化的数据顺序是不确定的。这时候就需要给他做个排序。比如:

Goods.objects.all().order_by('id');

这样就不会报错了

分页的具体样式设计可以操作官方文档:

https://www.django-rest-framework.org/api-guide/pagination/

完结  drf屌爆了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@凌晨三点半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值