我对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()方法如何使此查询集增长?
答案 0 :(得分:6)
您的过滤器适用于相关对象;对于<CliProfile: Sven>
两个匹配的对象,以便对象列出两次。
res2 = res.filter(some_attr__gte=a_datetime_object).distinct()
正如.distinct()
所述的文档:
默认情况下,
QuerySet
不会消除重复的行。实际上,这很少是一个问题,因为Blog.objects.all()
之类的简单查询不会引入重复结果行的可能性。 但是,如果您的查询跨越多个表格,则在评估QuerySet
时可能会出现重复结果。那是你使用distinct()
的时候。
强调我的。