按照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>]
答案 0 :(得分:3)
返回的民意调查有选择吗?看起来它为每个相关选择返回一个轮询实例,导致重复。要摆脱这些,请使用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。