为什么Django filter()会添加项而不是删除它们?

时间:2014-06-10 16:11:25

标签: python django

我对filter()方法的行为很好奇。 我在文档中读到它们可以被链接。好的,让我们试试:

# Returns a Queryset of 2 objects : [<CliProfile: Sven>, <CliProfile: David>]
res = SomeClass.objects.all()

# Returns a Queryset of 3 objects : [<CliProfile: Sven>, <CliProfile: Sven>, <CliProfile: David>]
res2 = res.filter(some_attr__gte=a_datetime_object) 

这怎么可能?如果初始查询集包含2个对象,那么filter()方法如何使此查询集增长?

1 个答案:

答案 0 :(得分:6)

您的过滤器适用于相关对象;对于<CliProfile: Sven>两个匹配的对象,以便对象列出两次。

添加.distinct() call

res2 = res.filter(some_attr__gte=a_datetime_object).distinct()

正如.distinct()所述的文档:

  

默认情况下,QuerySet不会消除重复的行。实际上,这很少是一个问题,因为Blog.objects.all()之类的简单查询不会引入重复结果行的可能性。 但是,如果您的查询跨越多个表格,则在评估QuerySet 时可能会出现重复结果。那是你使用distinct()的时候。

强调我的。