Python 是否每次都在django查询数据库中设置过滤查询?
假设我有以下代码:Python 是否每次都在django查询数据库中设置过滤查询?,python,django,database,Python,Django,Database,假设我有以下代码: qs=Users.objects.all() 列表=[] 对于范围(10)内的i: list.append(qs.filter(age=i)) 在这里,过滤器被调用10次,它是连接到数据库10次还是第一次使用过滤器,分配qs(由于懒惰)并且过滤器在本地应用(总共一个数据库连接) 在这里,过滤器被调用了10次,它是连接到数据库10次还是第一次使用过滤器 Django在调用.filter(…)时不执行查询。您只需构造一个QuerySet。只有当您使用QuerySet时,例如通过
qs=Users.objects.all()
列表=[]
对于范围(10)内的i:
list.append(qs.filter(age=i))
在这里,过滤器被调用10次,它是连接到数据库10次还是第一次使用过滤器,分配qs
(由于懒惰)并且过滤器在本地应用(总共一个数据库连接)
在这里,过滤器被调用了10次,它是连接到数据库10次还是第一次使用过滤器
Django在调用.filter(…)
时不执行查询。您只需构造一个QuerySet
。只有当您使用QuerySet
时,例如通过对对象进行迭代、订阅或调用len(…)
,您才能进行查询
因此,如果您随后在流程中迭代所有查询集,例如:
for myqs in mylist:
for obj in myqs:
print(obj)
mylist中的MyQ的:
对于MYQ中的obj:
打印(obj)
您将进行十个独立的查询,一个针对每个被评估的查询集的查询
如果迭代查询集,Django将在数据库上运行查询,并将结果(记录列表)存储在queryset
中。因此,这意味着如果您在该查询集上再次迭代,它将不会再次运行查询,而是重用queryset
中缓存的结果
请注意,订阅,即myqueryset[0]
,将进行查询以获取单个对象。如果您再次执行此操作,它将再次在数据库上运行查询
某些技术,如“批量查询”已经实现,如果需要其中一个结果,所有查询都将合并到数据库查询中。但据我所知,Django目前不支持Haxl。您目前根本不进行任何查询
QuerySet
s是惰性的,因此这意味着它将等待您使用QuerySet。如果您以后要对同一查询集进行多次迭代,它将进行一次查询,将结果存储在queryset
中,并在下次使用该结果。虽然这是正确的,但对于理解此示例中发生的情况也不是很有用。此示例创建10个不同的查询集。因此,最终访问数据确实会执行10次查询。@spectras:如果您稍后迭代列表中的所有查询集,那么它确实会执行10次查询。