本文共 2270 字,大约阅读时间需要 7 分钟。
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 mixinsfrom rest_framework import genericsclass 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.ListAPIViewclass 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 genericsclass 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');
这样就不会报错了
分页的具体样式设计可以操作官方文档:
完结 drf屌爆了
转载地址:http://znepi.baihongyu.com/