2

过滤查询集时,我想知道以下是否等效。

User.objects.filter(username='josh').filter(email__startswith='josh')
User.objects.filter(username='josh', email__startswith='josh')

我无法想象生成的 SQL 在两者之间会有什么不同。该文档似乎也没有提及任何差异。

4

2 回答 2

2

您可以在 shell 中执行这些查询并打印出生成的 SQL,例如:

>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query

我测试了一个类似的查询,就像你在这里一样,生成的 SQL 代码没有区别。两个语句最终都使用相同的 WHERE 语句。

此外,在这种情况下,无论您是链接过滤器还是一步应用它们,都不应该有任何区别。

但是在某些情况下,过滤顺序很重要。看看这里这里

于 2012-04-09T12:31:23.593 回答
0

Django QuerySets 是惰性的,运行:

User.objects.filter(username='josh').filter(email__startswith='josh')

甚至

a = User.objects.filter(username='josh')
a = a.filter(email__startswith='josh')

仅生成一个数据库查询,当您尝试访问数据时执行该查询。此类查询同意 where 子句中的所有过滤器和排除项。

于 2012-04-09T12:45:47.890 回答