分页报错如下:
/home/python/.virtualenvs/meiduo/lib/python3.6/site-packages/rest_framework/pagination.py:198: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'users.models.User'> QuerySet.
paginator = self.django_paginator_class(queryset, page_size)
代码如下:
自定义分页类:
# 自定义分页
from collections import OrderedDict
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
class StandardResultPagination(PageNumberPagination):
page_size = 3
page_size_query_param = 'page_size'
max_page_size = 30
def get_paginated_response(self, data):
"""分页之后的响应数据格式"""
return Response(OrderedDict([
('count', self.page.paginator.count),
('lists', data),
('page', self.page.number),
('pages', self.page.paginator.num_pages),
('pagesize', self.get_page_size(self.request))
]))
分页代码如下:
# /meiduo_admin/users/?keyword=<搜索内容>&page=<页码>&pagesize=<页容量>
class UserInfoew(ListAPIView):
'''查询用户'''
permission_classes = [IsAdminUser]
serializer_class = UserSerializer
pagination_class = StandardResultPagination # 这是分页代码
def get_queryset(self):
if self.request.query_params.get('keyword') is None or self.request.query_params.get('keyword') == '':
user = User.objects.filter(is_staff=False)
return user
else:
user = User.objects.filter(is_staff=False, username__contains=self.request.query_params.get('keyword'))
return user
错误原因代码:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'mobile', 'email')
定义用户序列化器
错误原因
警告我们分页对象没有排序
解决方法:(排序)
1.在分页代码上排序
def get_queryset(self):
if self.request.query_params.get('keyword') is None or self.request.query_params.get('keyword') == '':
user = User.objects.filter(is_staff=False).order_by('id')
return user
else:
user = User.objects.filter(is_staff=False, username__contains=self.request.query_params.get('keyword')).order_by('id')
return user
2.在用户模型上修改,让用户模型默认排序
def get_queryset(self):
if self.request.query_params.get('keyword') is None or self.request.query_params.get('keyword') == '':
user = User.objects.filter(is_staff=False).order_by('id')
return user
else:
user = User.objects.filter(is_staff=False, username__contains=self.request.query_params.get('keyword')).order_by('id')
return user