Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否每次都在django查询数据库中设置过滤查询?_Python_Django_Database - Fatal编程技术网

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次查询。