有人可以解释一下:
>>> 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
答案 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)