在Django教程中过滤掉无选择的轮询会导致索引中的轮询重复

2024-04-19 06:16:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我编辑了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]

但现在我的索引是这样的:

  • 你在干什么?你知道吗
  • 你在干什么?你知道吗
  • 你在干什么?你知道吗
  • 怎么了?你知道吗
  • 怎么了?你知道吗

这是怎么发生的?我该怎么解决这个问题?你知道吗

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

编辑:我已经检查了管理视图,似乎只有一个在DB中的每个投票(我没有直接检查),但我相信,它的设置方式,我不能有同一个ID的多个投票(这种情况下,所有的'你在做什么?'民调显示是2,所有的“怎么了?”投票具有ID 1)。你知道吗


Tags: the代码name视图id编辑date投票
1条回答
网友
1楼 · 发布于 2024-04-19 06:16:15

向方法链中添加distinct()(如Wolfsuggests)确实有效。我认为问题的关键在于,最终的DB查询将返回最近的轮询(pub_date__lte=timezone.now())和具有非空选项(choice__choice_text__isnull=False)的轮询的组合,而不考虑重叠。你知道吗

我不确定是否有比仅仅使用distinct()更好的方法从根本上防止这种情况。我试着用链子锁住过滤器,但似乎没什么区别。

事实证明,distinct是正确的解决方案:

“我搜索了解释,结果显示,当一个查询跨越多个表时,它可能返回重复的结果。distinct是正确的解决方案。“
Ludovic Viaudcomment

相关问题 更多 >