2017-05-17 14 views
22

我從Django的1.10.4升級到1.11.1,突然我得到一噸的這些消息的時候我跑我的測試:Python的Django的REST框架UnorderedObjectListWarning

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分頁模塊: https://github.com/django/django/blob/master/django/core/paginator.py#L100

這似乎與我的查詢集代碼:我如何才能找到對T的詳細信息

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 /命令,這些測試不會導致它....在get_queryset之後DRF做了什麼?

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

如果我把一個回溯到分頁然後我得到了一大堆給Django的REST框架,但沒有回指向哪個我詢問的觸發順序警告相關的東西。

+1

通常應該通過引起警告的測試名稱很容易找到。您可能想要運行詳細測試(大多數測試跑步者使用'-v 2') –

+0

謝謝@KlausD。這是一個有用的提醒。 –

+1

尋找你正在做''''offset'''和'''limit'''但沒有''order_by'''的查詢 – gipsy

回答

31

所以爲了解決這個問題我必須找到所有的alloffsetfilterlimit條款並添加order_by條款給他們。有些我加入一個默認的排序固定:

class Meta: 
    ordering = ['-id'] 

在ViewSets Django的REST框架(應用程序/ apiviews.py)我不得不更新所有的get_queryset方法添加一個默認的排序似乎沒有工作。

希望這可以幫助別人。 :)

6

我得到這樣的警告時,我使用objects.all()在我的view.py

profile_list = Profile.objects.all() 
paginator = Paginator(profile_list, 25) 

來解決這個我改變了我的代碼:

profile_list = Profile.objects.get_queryset().order_by('id') 
paginator = Paginator(profile_list, 25) 
+0

這也適用於我 - 謝謝! – Steve