rest_framework分页报错UnorderedObjectListWarning: Pagination may yield inconsistent results with an unor

本文讨论了在使用Django REST框架时遇到的分页报错UnorderedObjectListWarning,解释了错误产生的原因,即分页对象未排序。文章提供了两种解决方案:在分页代码中进行排序调整,或者在用户模型上设置默认排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分页报错如下:

/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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值