Python Django Rest 框架 UnorderedObjectListWarning

标签 python django django-rest-framework

我从 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 并且不会导致它.... DRF 在 get_queryset 之后做什么?

https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166

如果我将回溯放到分页中,那么我会得到一大堆与 django rest 框架相关的东西,但没有任何东西可以指出我的哪个查询触发了订单警告。

最佳答案

所以为了解决这个问题,我必须找到所有 alloffsetfilterlimit 子句并向它们添加 order_by 子句。我通过添加默认排序来修复一些问题:

class Meta:
   ordering = ['-id']

在 Django Rest Framework (app/apiviews.py) 的 ViewSets 中,我不得不更新所有 get_queryset 方法,因为添加默认排序似乎不起作用。

希望这对其他人有所帮助。 :)

关于Python Django Rest 框架 UnorderedObjectListWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033670/

相关文章:

javascript - django REST framework 嵌套序列化程序和带有文件的 POST 嵌套 JSON

Django - 在模板中安全地呈现 HTML

python - 为什么我不能通过 id 更新嵌套序列化器?

python - Django休息框架: Custom url pattern for Detail model-viewset with datetime lookup field

python - MITMProxy 性能不佳

python - Django 不发送服务器错误 (500) 电子邮件

django - 在 Django 中使用用户配置文件检索用户的最有效方法

angularjs - 如何在 Restangular 和 Django Rest Framework 中添加分页?

python - 如何将 Beautiful Soup 输出保存到我​​的 SQLite 数据库中?

javascript - Python网络浏览器: Disable Javascript?