过滤查询集时,我想知道以下内容是否相同。
User.objects.filter(username='josh').filter(email__startswith='josh')
User.objects.filter(username='josh', email__startswith='josh')
我无法想象生成的SQL如何在两者之间有所不同。文档似乎没有提到任何差异。
答案 0 :(得分:2)
您可以在shell中执行这些查询,并打印出生成的SQL,如:
>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query
我测试了类似于你到达的类似查询,生成的SQL代码没有区别。两个语句最终都使用了相同的WHERE语句。
在这种情况下,无论是链接过滤器还是一步应用它们,它都不应该有任何区别。
答案 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子句中排除。