链接的QuerySet过滤器是否相当于使用Django ORM在单个过滤器中定义多个字段?

时间:2012-04-09 11:37:31

标签: django django-models filtering

过滤查询集时,我想知道以下内容是否相同。

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

我无法想象生成的SQL如何在两者之间有所不同。文档似乎没有提到任何差异。

2 个答案:

答案 0 :(得分:2)

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

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

我测试了类似于你到达的类似查询,生成的SQL代码没有区别。两个语句最终都使用了相同的WHERE语句。

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

但是有些情况下过滤的顺序很重要。 看看herehere

答案 1 :(得分: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子句中排除。