假设我有一个已经评估过的查询集。
# queryset is evaluated here
queryset = MyModel.objects.filter(name="blabla")
for obj in queryset:
# do some stuff如果稍后在这个查询集上调用.values_list,那么它是对数据库进行额外调用,还是从queryset对象缓存中获取响应?
obj_map = {k: v in queryset.values_list("id", "name")} # <- does it make a call?发布于 2021-03-23 02:53:55
根据医生的说法,values_list函数返回查询集的子类,该子类克隆原始查询集的大部分属性。
在计算查询集时,它将填充其_result_cache属性,该属性用于不创建新查询集的方法。如果此值为None,则表示缓存为空。另外,根据医生的说法,values_list函数返回查询集的子类,该子类克隆原始查询集的大部分属性。但是,它不复制缓存:
print(queryset._result_cache)
# [<MyModel: 0>, <MyModel: 2>, <MyModel: 2> ... ]
print(queryset.values_list("id", "name")._result_cache)
# Nothing发布于 2021-03-22 06:50:29
检查这两条语句之后生成的查询,会发现数据库第二次被击中。试试这个:
from django.db import connection
queryset = MyModel.objects.filter(name="blabla")
for obj in queryset:
# do some stuff
print(len(connection.queries))
>>> 1
obj_map = {k: v in queryset.values_list("id", "name")}
print(len(connection.queries))
>>> 2您可以打印(connection.queries)来查看实际使用的查询。
https://stackoverflow.com/questions/66740866
复制相似问题