我已经为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,所有&#39什么东西?'民意调查有ID 1)。
答案 0 :(得分:0)
将distinct()
(作为Wolf suggests)添加到方法链中确实有效。我认为问题的关键在于最终的数据库查询返回最近的轮询(pub_date__lte=timezone.now()
)和轮询与非空选择(choice__choice_text__isnull=False
)的组合,而不管重叠。
我不确定是否有更好的方法来防止这种情况,而不仅仅是使用 distinct()
。我试过链接过滤器,这似乎没有区别。
事实证明, 是正确的解决方案:
“我搜索了解释,看来当一个查询跨越多个表时,它可以返回重复项。在这里,distinct是正确的解决方案。”
- Ludovic Viaud