我从Django 1.10.4升级到了1.11.1,在我运行测试的时候突然收到了大量的消息:
lib/python3.5/site-packages/rest_framework/pagination.py:208:
UnorderedObjectListWarning:
Pagination may yield inconsistent results with an unordered object_list:
<QuerySet [<Group: Requester>]>
paginator = self.django_paginator_class(queryset, page_size)
I've traced that back to the Django Pagination module: https://github.com/django/django/blob/master/django/core/paginator.py#L100
它似乎与我的queryset代码有关:
return get_user_model().objects.filter(id=self.request.user.id)
如何找到关于这个警告的更多细节?似乎我需要在每个过滤器的末尾添加一个order_by(id)
,但我似乎找不到哪个代码需要添加order_by(因为警告不返回堆栈跟踪,所以它在我的测试运行期间随机发生)。
谢谢!
编辑:
因此,通过使用@KlausD. verbosity tip,我查看了导致此错误的测试:response = self.client.get('/api/orders/')
这将转到OrderViewSet
,但get_queryset中的任何内容都不会导致它,序列化程序类中的任何内容都不会导致它。我有其他测试使用相同的代码来获取/api/orders,但这些测试不会导致它...... DRF在get_queryset之后做什么?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
如果我对分页进行回溯,那么我会得到一大堆与djangorest框架相关的东西,但是没有任何东西可以指出我的哪个查询触发了订单警告。
8条答案
按热度按时间njthzxwz1#
为了解决这个问题,我必须找到所有的
all
、offset
、filter
和limit
子句,并在其中添加一个order_by
子句。在Django Rest框架的ViewSets(app/apiviews.py)中,我必须更新所有的
get_queryset
方法,因为添加默认排序似乎不起作用。rkttyhzu2#
当我在我的www.example.com中使用objects.all()时,我收到此警告view.py
为了解决这个问题,我改变了我的代码:
ar5n3qh53#
在我的例子中,我不得不添加
order_by('id')
而不是ordering
。Ordering
需要在使用类 meta(而不是视图)的模型中。yh2wf1be4#
让我给予你一个最新的答案...
https://code.djangoproject.com/ticket/6089
Django中
User
模型的默认顺序已经被移除,如果你是因为升级而出现在这个页面,很可能是因为这个改变。您可能要处理的此问题有两个版本。
1.您自己的型号在其
Meta
中没有默认顺序(请参阅已接受的答案)1.您正在使用的模型来自您用作依赖项的应用程序,该依赖项没有默认顺序
因为Django
User
模型本身并不遵守顺序,所以很明显,第二种情况不能通过让依赖项的维护者使用默认顺序来解决。好吧,现在你要么重写模型,不管你做什么(有时候是个好主意,但不适合解决这样的小问题)。所以你只能在视图级别上解决这个问题,你还需要做一些事情来处理你所应用的排序过滤器类,为此,设置视图的
ordering
参数。另请参见Is there Django List View model sort?
yvgpqqbh5#
另一个选项是添加
OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
l7wslrjt6#
包括这个对我不起作用。
但是修改**get_queryset(self)并用.order_by('id ')**对列表进行排序确实有效。可能是因为我使用了过滤器,我不知道
p4tfgftt7#
改为更新模型 meta类。
您仍然可以根据AlanSE之前的建议,从视图属性“ordering”覆盖排序。
bvn4nwqk8#
在我的例子中,它需要一个元组,而这个元组必须包含一个逗号,即使您只解析其中的一个项。