Ich habe ein Upgrade von Django 1.10.4 auf 1.11.1 durchgeführt und plötzlich erhalte ich eine Menge dieser Meldungen, wenn ich meine Tests durchführe:
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)
Ich habe das auf das Django-Paginierungsmodul zurückgeführt: https://github.com/django/django/blob/master/django/core/paginator.py#L100
Es scheint mit meinem Queryset-Code zu tun zu haben:
return get_user_model().objects.filter(id=self.request.user.id)
Wie finde ich weitere Details zu dieser Warnung? Es scheint, dass ich order_by(id)
am Ende jedes Filters ein hinzufügen muss, aber ich kann anscheinend nicht finden, welcher Code das Hinzufügen von order_by benötigt (da die Warnung keinen Stack-Trace zurückgibt und dies während meines Tests zufällig geschieht Lauf).
Vielen Dank!
Bearbeiten:
Also mit @KlausD. Tipp zur Ausführlichkeit: Ich habe mir einen Test angesehen, der diesen Fehler verursacht hat:
response = self.client.get('/api/orders/')
Dies geht an, OrderViewSet
aber keines der Dinge in get_queryset verursacht es und nichts in der Serializer-Klasse verursacht es. Ich habe andere Tests, die denselben Code verwenden, um / api / orders abzurufen, und diese verursachen ihn nicht .... Was macht DRF nach get_queryset?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
Wenn ich einen Traceback in die Paginierung einbaue, erhalte ich eine ganze Reihe von Informationen zum Django-Rest-Framework, aber nichts, was darauf hindeutet, welche meiner Abfragen die Bestellwarnung auslöst.
quelle
-v 2
bei den meisten Testläufern)offset
undlimit
doch nichtorder_by
Antworten:
Also, um diese zu beheben ich hatte all die finden
all
,offset
,filter
undlimit
Klauseln und fügen Sie eineorder_by
ihnen Klausel. Einige habe ich durch Hinzufügen einer Standardreihenfolge behoben:class Meta: ordering = ['-id']
In den ViewSets für Django Rest Framework (app / apiviews.py) musste ich alle
get_queryset
Methoden aktualisieren , da das Hinzufügen einer Standardreihenfolge nicht zu funktionieren schien.Hoffe das hilft jemand anderem. :) :)
quelle
-
In-ordering = ['-id']
Reihenfolge Ihrer Abfrage in absteigender Reihenfolge hinzufügen .Ich habe diese Warnung erhalten, als ich objects.all () in meiner view.py verwendet habe
profile_list = Profile.objects.all() paginator = Paginator(profile_list, 25)
Um dies zu beheben, habe ich meinen Code geändert in:
profile_list = Profile.objects.get_queryset().order_by('id') paginator = Paginator(profile_list, 25)
quelle
Profile.objects.all().order_by('id')
.. zumindest funktioniert das bei mir, sonst bekomme ichAttributeError: type object 'Profile' has no attribute 'get_queryset'
Lassen Sie mich eine aktualisierte Antwort auf neue Entwicklungen geben ...
https://code.djangoproject.com/ticket/6089
Die Standardreihenfolge des
User
Modells wurde in Django entfernt. Wenn Sie sich aufgrund eines Upgrades auf dieser Seite befanden, ist dies sehr wahrscheinlich mit dieser Änderung verbunden.Es gibt zwei Versionen dieses Problems, mit denen Sie sich möglicherweise befassen.
Meta
(siehe akzeptierte Antwort)Da das Django-
User
Modell selbst buchstäblich nicht der Reihenfolge entspricht, ist es sehr klar, dass das zweite Szenario nicht gelöst werden kann, indem die Betreuer dieser Abhängigkeiten gebeten werden, eine Standardreihenfolge einzugeben. Okay, jetzt müssen Sie entweder das Modell überschreiben, das für Ihre Aktivitäten verwendet wird (manchmal eine gute Idee, aber nicht gut, um ein so kleines Problem zu lösen).Sie müssen es also auf Ansichtsebene ansprechen. Sie möchten auch etwas tun, das mit jeder von Ihnen angewendeten Filterklasse gut funktioniert. Stellen Sie dazu den
ordering
Parameter der Ansicht ein .class Reviewers(ListView): model = User paginate_by = 50 ordering = ['username']
Siehe auch Gibt es eine Django List View-Modellsortierung?
quelle
Eine weitere Option ist das Hinzufügen
OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
quelle
Aktualisieren Sie stattdessen die Modell-Metaklasse.
class UsefulModel(models.Model): class Meta: ordering='-created' # for example
Sie können die Reihenfolge weiterhin über das Ansichtsattribut 'Bestellung' überschreiben . Dies wurde zuvor von AlanSE empfohlen .
class UsefulView(ListView): ordering = ['-created']
quelle
In meinem Fall musste ich
order_by('id')
statt hinzufügenordering
.class IntakeCaseViewSet(viewsets.ModelViewSet): schema = None queryset = IntakeCase.objects.all().order_by('id')
quelle
Das einzuschließen hat bei mir nicht funktioniert.
class Meta: ordering = ['-id']
Das Ändern von get_queryset (self) und das Sortieren der Liste mit .order_by ('id') hat dies jedoch getan. Vielleicht hat es funktioniert, weil ich Filter verwende, ich weiß es nicht
class MyView(viewsets.ModelViewSet): queryset = MyModel.objects.all() serializer_class = MySerializerSerializer def get_queryset(self): user = self.request.user return MyModel.objects.filter(owner=user).order_by('id')
quelle