【问题标题】:Filtering out choiceless polls in the Django tutorial causes polls in the index to duplicate在 Django 教程中过滤掉无选择的投票会导致索引中的投票重复
【发布时间】:2015-01-14 16:25:28
【问题描述】:

我已经编辑了来自tutorial 的代码,使索引视图看起来像这样:

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        """
        Return the last five published polls (not including those set to be
        published in the future, or those without choices).
        """
        return Poll.objects.filter(
            pub_date__lte=timezone.now(), choice__choice_text__isnull=False
        ).order_by('-pub_date')[:5]

但现在我的索引看起来像这样:

  • 你在做什么?
  • 你在做什么?
  • 你在做什么?
  • 怎么了?
  • 怎么了?

这是怎么发生的?我应该如何解决这个问题?

(ps 我不知道该给谁使用过滤器,所以我从这个question 复制了代码。这就是它不起作用的原因吗?双下划线__ 符号如何在过滤器中工作?)子>

编辑:我检查了管理视图,数据库中似乎只有一个民意调查(我没有直接检查),但我确信它的设置方式我不能有多个具有相同 ID 的民意调查(在这种情况下,所有“你在做什么?”民意调查的 ID 为 2,所有“怎么样?”民意调查的 ID 为 1)。

【问题讨论】:

  • 也许它与代码中的错误无关。您可能测试并重新加载了该站点的页面,因此检查数据库,也许您看到的民意调查确实在数据库中,重复。对于双下划线符号,您可以在此处找到完整的解释 docs.djangoproject.com/en/1.7/topics/db/queries/#field-lookups
  • @LudovicViaud 我已经尽力打折了。
  • 您可能只需要查询集上的.distinct()

标签: python django double-underscore


【解决方案1】:

distinct()(如Wolfsuggests)添加到方法链确实有效。我认为问题的症结在于最终的数据库查询会返回最近的民意调查 (pub_date__lte=timezone.now()) 和具有非空选项 (choice__choice_text__isnull=False) 的民意调查的组合,而不考虑重叠。

我不确定是否有比仅使用 distinct() 更好的方法来防止这种情况发生。我尝试链接过滤器,这似乎没有任何区别。

事实证明,不同的正确的解决方案:

“我搜索了解释,似乎当查询跨越多个表时,它可能会返回重复项。这里的正确解决方案是不同的。”
Ludovic Viaudcomment

【讨论】:

  • choice__choice_text_isnull=False 可以替换为choice__isnull=False。我搜索了解释,似乎当查询跨越多个表时,它可以返回重复项。 distinct 是这里的正确解决方案
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 2012-10-29
  • 2014-02-01
  • 1970-01-01
  • 2012-03-15
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多