我从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)
我已经将其追溯到Django Pagination模块:https : //github.com/django/django/blob/master/django/core/paginator.py#L100
它似乎与我的查询集代码有关:
return get_user_model().objects.filter(id=self.request.user.id)
我如何找到有关此警告的更多详细信息?似乎我需要order_by(id)在每个过滤器的末尾添加一个,但是我似乎找不到要添加order_by的代码(因为警告不会返回堆栈跟踪,因此它在测试期间会随机发生跑)。
谢谢!
编辑:
因此,使用@KlausD。详细提示,我查看了一个导致此错误的测试:
response = self.client.get('/api/orders/')
这可以解决,OrderViewSet但是get_queryset中的任何事情都不会导致它,而序列化程序类中的任何原因都不会导致它。我还有其他使用相同代码获取/ api / orders的测试,而这些测试不会导致此问题。...get_queryset之后DRF会做什么?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
如果我对分页进行追溯,那么我会得到一堆与django rest框架有关的东西,但没有任何东西指向我的哪个查询正在触发顺序警告。
因此,为了解决这个问题我必须找到所有的all,offset,filter,以及limit条款和补充order_by条款给他们。我通过添加默认顺序来解决一些问题:
1.
class Meta:
ordering = ['-id']
在```
Django Rest Framework的ViewSets(app / apiviews.py)中,我不得不更新所有get_queryset方法,因为添加默认顺序似乎不起作用。
希望这对其他人有帮助。:)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。