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.
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. :)
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)
une Autre option est d'ajouter OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter