每次都在django查询数据库中过滤查询集吗?

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(由于懒惰)并且过滤器在本地应用(总共一个数据库连接)?

Wil*_*sem 6

\n

这里过滤器被调用 10 次,它是连接到数据库 10 次还是第一次使用过滤器。

\n
\n

当您调用 时,Django 不会执行查询.filter(\xe2\x80\xa6)。您只需构造一个QuerySet. 仅当您使用QuerySet(例如通过迭代它、下标或调用len(\xe2\x80\xa6)对象),您才会进行查询。

\n

如果您稍后在此过程中迭代所有查询集,例如:

\n
for myqs in mylist:\n    for obj in myqs:\n        print(obj)
Run Code Online (Sandbox Code Playgroud)\n

您将进行十个单​​独的查询,每个查询集都会被评估。

\n

如果您迭代查询集,那么 Django 将在数据库上运行查询,并将结果(记录列表)存储在QuerySet. 因此,这意味着如果您第二次迭代此查询集,它将不会再次运行该查询,而是重用.QuerySet

\n

请注意,下标,即myqueryset[0],将进行查询以获取单个对象。如果您第二次执行此操作,它将再次在数据库上运行查询。

\n

某些技术,如Haxl \xc2\xa0 [GitHub]已实现“批量查询”,如果需要其中一个结果,所有查询都会合并到数据库的查询中。但据我所知,Django 目前还不支持 Haxl。

\n