2017-05-17 3 views
22

ich von Django 1.10.4 bis 1.11.1 aktualisiert und ganz plötzlich ich eine Tonne dieser Nachrichten bekommen, wenn ich meine Tests ausführen:Python Django übriges Rahmen 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) 

Ich habe verfolgt dass zurück zum Django Paginierung Modul: https://github.com/django/django/blob/master/django/core/paginator.py#L100

Es scheint mein queryset Code verwandt zu sein:

return get_user_model().objects.filter(id=self.request.user.id) 

Wie kann ich weitere Informationen über t finden seine Warnung? Es scheint so zu sein, dass ich am Ende jedes Filters einen order_by(id) hinzufügen muss, aber ich kann nicht scheinen, welcher Code den order_by hinzugefügt hat (weil die Warnung keinen Stack - Trace zurückgibt und so geschieht es zufällig während meiner Testlauf).

Danke!

Edit:

So von @KlausD verwenden. Ausführlichkeit Spitze, sah ich einen Test verursacht diesen Fehler:

response = self.client.get('/api/orders/')

Dies geht zu OrderViewSet aber keiner der Dinge in get_queryset weil es nichts in Serializer Klasse verursacht es. Ich habe andere Tests, die den gleichen Code verwenden, um/api/orders zu bekommen, und diese verursachen es nicht .... Was macht DRF nach get_queryset?

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

Wenn ich eine Rückverfolgung in Paginierung setzen dann bekomme ich eine ganze Reihe von Sachen im Zusammenhang Rest Rahmen aber nichts django, die die Reihenfolge Warnung, welche meiner Anfragen zurückweist auslöst.

+1

Normalerweise sollte es sein leicht zu finden durch den Namen des Tests, der die Warnung verursacht. Vielleicht möchten Sie Tests mit Ausführlichkeit durchführen ('-v 2' auf den meisten Testläufern) –

+0

Danke @KlausD. Das ist eine hilfreiche Erinnerung. –

+1

Sucht nach Abfragen, wo Sie eine '' 'Offset'' und' 'Limit''', aber keine' '' 'order_by''' – gipsy

Antwort

31

Also, um dieses Problem zu beheben hatte ich all die all, offset, filter und limit Klauseln zu finden und eine order_by Klausel ergänzen. Einige, die ich festgelegt durch eine Standard-Bestellung hinzufügen:

class Meta: 
    ordering = ['-id'] 

In den Viewsets für Django Ruhe Framework (app/apiviews.py) Ich hatte all die get_queryset Methoden zu aktualisieren, wie das Hinzufügen einer Standardreihenfolge nicht zu funktionieren scheint .

Hoffe das hilft jemand anderem. :)

6

Ich wurde diese Warnung, wenn ich verwendet objects.All() in meinem view.py

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

dieses Problem zu beheben änderte ich meinen Code:

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

Das funktionierte für mich auch - danke! – Steve

Verwandte Themen