在Django中,每次我过滤掉查询集或从对象中解析字段时,查询集都会对数据库执行新的SQL查询吗?
例如...如果我执行:
a = test.objects.all()
a2 = a.filter(name='Alex')
a3 = a.filter(name='John')
a4 = a.filter(name='Steve')
此序列是否将4个查询发送到数据库?还是只是发送1,然后在Python中处理过滤器?
出于速度目的,我正在尝试向数据库进行尽可能少的查询...并且不知道这是否实际上在造成更多的速度瓶颈?
谢谢。
答案 0 :(得分:3)
Django querysets are lazy。以下行不会引起任何数据库查询。
a = test.objects.all()
a2 = a.filter(name='Alex')
a3 = a.filter(name='John')
a4 = a.filter(name='Steve')
话虽如此,如果您要对所有四个查询集进行评估(例如,使用list
,则将执行4个单独的查询。
a = list(test.objects.all())
a2 = list(a.filter(name='Alex'))
a3 = list(a.filter(name='John'))
a4 = list(a.filter(name='Steve'))
数据库非常快。对于此示例,让数据库执行所有四个查询可能很好。您可以尝试在一个查询中获取想要的三个名称,例如:
a_combined = a.filter(name__in=['Alex', 'John', 'Steve'])
但是这会使您的代码更复杂。 Django没有提供在Python中进行filter()
调用的方法。
您可能会发现django-debug-toolbar对查看视图正在执行的查询很有用。