过滤器语法的差异

时间:2015-12-15 10:05:59

标签: python django

在文档here中,

之间似乎存在差异
Blog.objects.filter(
    entry__authors__isnull=False,
    entry__authors__name__isnull=True)

Blog.objects\
    .filter(entry__authors__isnull=False)\
    .filter(entry__authors__name__isnull=True)

是这样的吗?

1 个答案:

答案 0 :(得分:0)

文档试图说的是,如果在您的查询中authors不存在,那么django将在此时返回null,然后它似乎仍会继续尝试要做isnull但要与authors进行比较,而不是与预期的name进行比较,从而显示可能无效的结果。

他们在文档中显示的建议是检查作者是否为空且名称为空。

因此,在回答您的确切问题时,您显示的查询应生成相同的结果,因为它们应针对同一查询进行优化。

如果它们没有经过优化,那么由于您首先过滤掉author不为空的所有元素

,因此仍会产生相同的结果

示例:

 query = Blog.objects.filter(entry__authors__name__isnull=True)

案例1 - entry__authors为空

这样可以满足条件,因为它会检查entry__authors__isnull因此返回的结果包含没有作者的条目

案例2 - entry__authors不是

执行支票编写,查找具有空名称的作者,返回条目确实有作者的结果,但这些作者没有名字。