蟒蛇。 Django在查询集上迭代了一个荒谬的数量。很特别

时间:2017-01-18 22:30:35

标签: django django-queryset

有人可以解释一下:

>>> 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 
>>> 

是不是应该在查询集中的每个对象上迭代一次?为什么它重复id为15的对象7次。我不明白。该项目正在生产中。请帮忙。

修改

如果我删除order_by,则有效:

>>> procesos_concluidos = EventoSubasta.objects.filter(concluido=True, eliminado=False)
>>> for p in procesos_concluidos:
...   print p.id
... 
4
3
5
15
9
8
13

添加disctinct()不起作用:

>>> 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

2 个答案:

答案 0 :(得分:2)

来自docs for Interaction with default ordering or order_by()

  

在选择输出数据时,将使用在查询集的order_by()部分中提及的字段(或在模型的默认排序中使用的字段),即使它们未在values()调用中另行指定。 这些额外字段用于将“喜欢”结果组合在一起,它们可以使其他相同的结果行看起来是分开的

答案 1 :(得分:1)

非常感谢Sayse指出我的文档所以我可以阅读问题的原因。尝试添加distinct()但它没有用(我在问题中添加了)。这就解决了它:

lista_b = sorted(lista, key=lambda x : x.fechasubasta_set.last().fecha, reverse=True)