想象一下我有以下代码:
qs = Users.objects.all()
list = []
for i in range(10):
list.append(qs.filter(age=i))
这里过滤器被调用 10 次,它是连接到数据库 10 次还是第一次使用过滤器,qs
是否已分配(由于懒惰)并且过滤器在本地应用(总共一个数据库连接)?
这里过滤器被调用 10 次,它是连接到数据库 10 次还是第一次使用过滤器。
当你调用时Django不执行查询.filter(…)
。你只需要构建一个QuerySet
。只有当你consume a QuerySet
,例如通过迭代覆盖它、订阅或调用len(…)
在该对象上,您进行查询。
如果您稍后在此过程中迭代所有查询集,例如:
for myqs in mylist:
for obj in myqs:
print(obj)
你会做十个单独的查询,对每个被评估的查询集的查询。
如果您迭代查询集,那么 Django 将在数据库上运行查询,并将结果(记录列表)存储在QuerySet
。这意味着如果你迭代second超过此查询集的时间,它不会再次运行该查询,但是reuse结果缓存在QuerySet
.
请注意下标,即myqueryset[0]
,将进行查询以获取单个对象。如果您第二次执行此操作,它将再次在数据库上运行查询。
Certain technologies, like Haxl [GitHub] https://github.com/facebook/Haxl have been implemented to "batch queries", and in case one of the results is necessary, all queries are combined in the query to the database. But as far as I know, Django has no support for Haxl at the moment.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)