按照 djangoproject 的教程,我创建了一个包含 2 个民意调查的民意调查。
In [14]: Poll.objects.all()
Out[14]: [<Poll: poll1>, <Poll: poll2>]
当我应用过滤器时
In [18]: Poll.objects.filter(choice__choice_text__isnull=False)
即使只有 2 项民意调查,也会返回以下内容。
Out[18]: [<Poll: poll1>, <Poll: poll1>, <Poll: poll1>, <Poll: poll2>, <Poll: poll2>, <Poll: poll2>]
为什么同一个民意调查会多次出现?过滤器的目标是过滤掉没有任何选择的民意调查。此外,像下面这样的其他过滤器也可以工作。
In [19]: Poll.objects.filter(pub_date__lte=timezone.now)
Out[19]: [<Poll: poll1>, <Poll: poll2>]
最佳答案
返回的民意调查有选择吗?看起来它为每个关联的选择返回一个民意调查实例,从而导致重复。要摆脱这些,请使用 distinct()
:
Poll.objects.filter(choice__choice_text__isnull=False).distinct()
更新:让我们深入了解一下。您的第一个查询跨越 Poll-Choice 关系,使用幕后 JOIN 来“组合”两个表。 (JOIN 可能很复杂,因此如果这令人困惑,我建议对其进行研究。)您的查询将为每个文本为 null 的 Choice 返回一个 Poll 对象。
另一方面,您的第二个查询只是从投票表中进行选择。该行:
Poll.objects.filter(pub_date__lte=timezone.now)
翻译为SELECT * FROM poll WHERE pub_date <= tz.now
。有关字段查找的更多详细信息,请参阅the docs 。有关跨越关系的更多指导,请参阅 the docs again .
关于python - Poll.objects.filter() 返回同一轮询的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15755091/