Ham*_*ian 5 python database django django-queryset
想象一下我有以下代码:
qs = Users.objects.all()
list = []
for i in range(10):
list.append(qs.filter(age=i))
Run Code Online (Sandbox Code Playgroud)
这里过滤器被调用 10 次,它是否连接到数据库 10 次或第一次使用过滤器,分配qs(由于懒惰)并且过滤器在本地应用(总共一个数据库连接)?
\n\n这里过滤器被调用 10 次,它是连接到数据库 10 次还是第一次使用过滤器。
\n
当您调用 时,Django 不会执行查询.filter(\xe2\x80\xa6)。您只需构造一个QuerySet. 仅当您使用时QuerySet(例如通过迭代它、下标或调用len(\xe2\x80\xa6)对象),您才会进行查询。
如果您稍后在此过程中迭代所有查询集,例如:
\nfor myqs in mylist:\n for obj in myqs:\n print(obj)Run Code Online (Sandbox Code Playgroud)\n您将进行十个单独的查询,每个查询集都会被评估。
\n如果您迭代查询集,那么 Django 将在数据库上运行查询,并将结果(记录列表)存储在QuerySet. 因此,这意味着如果您第二次迭代此查询集,它将不会再次运行该查询,而是重用.QuerySet
请注意,下标,即myqueryset[0],将进行查询以获取单个对象。如果您第二次执行此操作,它将再次在数据库上运行查询。
某些技术,如Haxl \xc2\xa0 [GitHub]已实现“批量查询”,如果需要其中一个结果,所有查询都会合并到数据库的查询中。但据我所知,Django 目前还不支持 Haxl。
\n