Actualicé de Django 1.10.4 a 1.11.1 y, de repente, recibo muchos de estos mensajes cuando ejecuto mis pruebas:
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)
Lo rastreé hasta el módulo de paginación de Django: https://github.com/django/django/blob/master/django/core/paginator.py#L100
Parece estar relacionado con mi código de conjunto de consultas:
return get_user_model().objects.filter(id=self.request.user.id)
¿Cómo puedo encontrar más detalles sobre esta advertencia? Parece ser que necesito agregar un order_by(id)
al final de cada filtro, pero parece que no puedo encontrar qué código necesita el order_by agregado (porque la advertencia no devuelve un seguimiento de pila y, por lo tanto, sucede aleatoriamente durante mi prueba correr).
¡Gracias!
Editar:
Entonces, usando @KlausD. consejo de verbosidad, miré una prueba que causaba este error:
response = self.client.get('/api/orders/')
Esto va a OrderViewSet
pero ninguna de las cosas en get_queryset lo causa y nada en la clase de serializador lo causa. Tengo otras pruebas que usan el mismo código para obtener / api / orders y esas no lo causan ... ¿Qué hace DRF después de get_queryset?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
Si pongo un rastreo en la paginación, obtengo un montón de cosas relacionadas con el marco de descanso de django, pero nada que indique cuál de mis consultas está activando la advertencia de orden.
fuente
-v 2
en la mayoría de los corredores de pruebas)offset
ylimit
pero noorder_by
Respuestas:
Así que con el fin de solucionar este problema tenía que encontrar todos los
all
,offset
,filter
, ylimit
las cláusulas y añadir unaorder_by
cláusula a ellos. Algunos los arreglé agregando un pedido predeterminado:class Meta: ordering = ['-id']
En ViewSets for Django Rest Framework (app / apiviews.py) tuve que actualizar todos los
get_queryset
métodos ya que agregar un orden predeterminado no parecía funcionar.Espero que esto ayude a alguien más. :)
fuente
-
deordering = ['-id']
las órdenes de su consulta en orden descendente.Recibí esta advertencia cuando usé objects.all () en mi view.py
profile_list = Profile.objects.all() paginator = Paginator(profile_list, 25)
para arreglar esto cambié mi código a:
profile_list = Profile.objects.get_queryset().order_by('id') paginator = Paginator(profile_list, 25)
fuente
Profile.objects.all().order_by('id')
... al menos eso funciona para mí, de lo contrario lo consigoAttributeError: type object 'Profile' has no attribute 'get_queryset'
Déjame darte una respuesta actualizada a los nuevos desarrollos ...
https://code.djangoproject.com/ticket/6089
El orden predeterminado del
User
modelo se ha eliminado en Django. Si se encontró en esta página debido a una actualización, es muy probable que esté relacionado con este cambio.Hay 2 versiones de este problema con las que podría estar lidiando.
Meta
(ver respuesta aceptada)Dado que, literalmente, el
User
modelo de Django en sí mismo no se adhiere al orden, está muy claro que el segundo escenario no se puede resolver pidiendo a los mantenedores de esas dependencias que pongan un orden predeterminado. Bien, ahora tiene que anular el modelo que se está utilizando para lo que sea que esté haciendo (a veces es una buena idea, pero no es buena para abordar un problema tan pequeño).Así que te queda abordarlo en el nivel de vista. También desea hacer algo que funcione bien con cualquier clase de filtro de pedido que haya aplicado. Para eso, configure el
ordering
parámetro de la vista .class Reviewers(ListView): model = User paginate_by = 50 ordering = ['username']
Consulte también ¿Hay ordenación del modelo de vista de lista de Django?
fuente
Otra opción es agregar
OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
fuente
En su lugar, actualice la metaclase del modelo.
class UsefulModel(models.Model): class Meta: ordering='-created' # for example
aún puede anular el orden desde el atributo de vista 'ordenar' como lo aconsejó AlanSE anteriormente.
class UsefulView(ListView): ordering = ['-created']
fuente
En mi caso, tuve que agregar en
order_by('id')
lugar deordering
.class IntakeCaseViewSet(viewsets.ModelViewSet): schema = None queryset = IntakeCase.objects.all().order_by('id')
fuente
Incluir esto no funcionó para mí.
class Meta: ordering = ['-id']
Pero cambiar get_queryset (self) y ordenar la lista con .order_by ('id') sí lo hizo. Tal vez funcionó porque estoy usando filtros, no lo sé
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')
fuente