1. ホーム
  2. python

[解決済み] Python Django Rest Framework UnorderedObjectListWarning

2022-09-24 08:20:53

質問

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.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

pagination にトレースバックを置くと、django rest framework に関連するものがたくさん出てきますが、どのクエリが順序の警告をトリガーしているかを示すものは何もありません。

どのように解決するのですか?

これを解決するために、私はすべての all , offset , filter そして limit 節を追加し order_by 節を追加しました。 いくつかは、デフォルトの順序を追加することで修正しました。

class Meta:
   ordering = ['-id']

ViewSets for Django Rest Framework (app/apiviews.py) の中で、私はすべての get_queryset メソッドを更新する必要がありました。

これが誰かの助けになることを願っています :)