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屌爆了