Python Django Rest Framework UnorderedObjectListWarning

je suis passé de Django 1.10.4 à 1.11.1 et tout d'un coup je reçois une tonne de ces messages quand je fais mes tests:

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)

j'ai remonté ça au module de Pagination de Django: https://github.com/django/django/blob/master/django/core/paginator.py#L100

Il semble être lié à mon queryset code:

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

Comment puis-je trouver plus de détails sur cet avertissement? Il me semble que j'ai besoin d'ajouter un order_by(id) à la fin de chaque filtrer, mais je n'arrive pas à trouver quel code a besoin de l'order_by ajouté (parce que l'avertissement ne renvoie pas de trace de pile et donc cela se produit au hasard pendant mon essai).

Merci!

Edit:

donc en utilisant @KlausD. le niveau de verbosité de la pointe, j'ai regardé un test à l'origine de ce message d'erreur:

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

va OrderViewSet mais aucun de choses dans get_queryset la cause, et rien dans le sérialiseur classe causes. J'ai d'autres tests qui utilisent le même code pour obtenir / api / orders et ceux qui ne le causent pas.... Que fait DRF après get_queryset?

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

si je mets un traceback dans la pagination alors j'obtiens tout un tas de choses liées à django rest framework mais rien qui renvoie à laquelle de mes requêtes déclenche l'avertissement d'ordre.

35
demandé sur Denise Mauldin 2017-05-17 22:53:21

3 réponses

Donc pour remédier à cela, j'ai dû trouver tous les all,offset, filter et limit les clauses et ajouter un order_by l'article. J'en ai corrigé quelques-unes en ajoutant un ordre par défaut:

class Meta:
   ordering = ['-id']

Dans le ViewSets pour Django Rest Framework (app/apiviews.py) j'ai dû mettre à jour tous les get_queryset les méthodes comme l'ajout d'un ordre par défaut ne semblaient pas fonctionner.

Espérons que cela aide quelqu'un d'autre. :)

51
répondu Denise Mauldin 2017-05-17 23:45:54

je recevais cet avertissement lorsque j'ai utilisé des objets.tout () dans mon view.py

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

pour corriger ce que j'ai changé mon code :

profile_list = Profile.objects.get_queryset().order_by('id')
paginator = Paginator(profile_list, 25)
12
répondu Rajiv Sharma 2017-09-11 04:32:26

une Autre option est d'ajouter OrderingFilter

http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter

0
répondu Michael Benin 2018-07-04 18:42:53