Reputation: 11573
Can someone explain me this:
>>> from inicio.models import EventoSubasta
>>> procesos_concluidos = EventoSubasta.objects.filter(concluido=True, eliminado=False).order_by("-fechasubasta__fecha")
>>> procesos_concluidos.count()
7
>>> for proceso in procesos_concluidos:
... print "proceso.codigo_proceso: %s - proceso.id: %s " % (proceso.codigo_proceso, proceso.id)
...
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP010-2016 - proceso.id: 15
proceso.codigo_proceso: SP006-2016 - proceso.id: 13
proceso.codigo_proceso: SP005-2016 - proceso.id: 8
proceso.codigo_proceso: SP003-2016 - proceso.id: 5
proceso.codigo_proceso: SP004-2016 - proceso.id: 9
proceso.codigo_proceso: SP002-2016 - proceso.id: 4
proceso.codigo_proceso: SP001-2016 - proceso.id: 3
>>>
Isn't it supposed to iterate once over each object in the queryset? why is it repeating the object with id 15 seven times. I don't understand. The project is in production. Please help.
EDIT
If I remove order_by
, it works:
>>> procesos_concluidos = EventoSubasta.objects.filter(concluido=True, eliminado=False)
>>> for p in procesos_concluidos:
... print p.id
...
4
3
5
15
9
8
13
Adding disctinct() doesn't work:
>>> procesos_concluidos = EventoSubasta.objects.filter(concluido=True, eliminado=False).order_by("-fechasubasta__fecha").distinct()
>>> for p in procesos_concluidos:
... print p.id
...
15
15
15
15
15
15
15
13
8
5
9
4
3
>>> procesos_concluidos = EventoSubasta.objects.filter(concluido=True, eliminado=False).distinct().order_by("-fechasubasta__fecha")
>>> for p in procesos_concluidos:
... print p.id
...
15
15
15
15
15
15
15
13
8
5
9
4
3
Upvotes: 0
Views: 57
Reputation: 11573
Thanks a lot to Sayse for pointing me to the docs so I can read the cause of the problem. Tried adding distinct()
but it didn't work (I added that to the question) . This is what solved it:
lista_b = sorted(lista, key=lambda x : x.fechasubasta_set.last().fecha, reverse=True)
Upvotes: 1
Reputation: 43330
From the docs for Interaction with default ordering or order_by()
Fields that are mentioned in the order_by() part of a queryset (or which are used in the default ordering on a model) are used when selecting the output data, even if they are not otherwise specified in the values() call. These extra fields are used to group “like” results together and they can make otherwise identical result rows appear to be separate
Upvotes: 2