python - Poll.objects.filter() 返回同一轮询的多个实例

标签 python django django-apps

按照 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/

相关文章:

python - 在给定一些约束的情况下,对等腰三角形的两个剩余顶点进行采样

python - 使用正则表达式去除多行 python 文档字符串

python - 如果结束标记为 <\\/p>,如何获取 <p> 内的值列表

python - 从 django_coverage 中排除系统路径

django - 跨应用程序使用 django 模型?

python - 如何删除 Pandas 列中特殊字符前面的部分字符串?

python - MVC 和 Django 基础知识

mysql - Django 和 MySQL 发生奇怪的错误

python - Django 中的线程在生产环境中不起作用

python - 当用户在 Django 管理中时如何获取当前应用程序?