2

按照 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>]
4

1 回答 1

3

返回的民意调查是否有选择?看起来它为每个关联的选择返回一个轮询实例,导致重复。要摆脱这些,请使用distinct()

Poll.objects.filter(choice__choice_text__isnull=False).distinct()

更新:让我们深入了解一下。您的第一个查询跨越 Poll-Choice 关系,在幕后使用 JOIN 来“组合”两个表。(JOIN 可能很复杂,所以如果这令人困惑,我建议研究它们。)您的查询为每个文本为 null 的 Choice 返回一个 Poll 对象。

另一方面,您的第二个查询只是从您的 Poll 表中进行选择。该行:

Poll.objects.filter(pub_date__lte=timezone.now)

转换为SELECT * FROM poll WHERE pub_date <= tz.now。有关字段查找的更多详细信息,请参阅文档。有关跨越关系的更多指导,请再次参阅文档

于 2013-04-02T02:44:38.167 回答