首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >queryset.values_list会再给db打电话吗?

queryset.values_list会再给db打电话吗?
EN

Stack Overflow用户
提问于 2021-03-22 05:45:02
回答 2查看 388关注 0票数 2

假设我有一个已经评估过的查询集。

代码语言:javascript
复制
# queryset is evaluated here
queryset = MyModel.objects.filter(name="blabla")

for obj in queryset:
  # do some stuff

如果稍后在这个查询集上调用.values_list,那么它是对数据库进行额外调用,还是从queryset对象缓存中获取响应?

代码语言:javascript
复制
obj_map = {k: v in queryset.values_list("id", "name")} # <- does it make a call?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-23 02:53:55

根据医生的说法values_list函数返回查询集的子类,该子类克隆原始查询集的大部分属性。

在计算查询集时,它将填充其_result_cache属性,该属性用于不创建新查询集的方法。如果此值为None,则表示缓存为空。另外,根据医生的说法values_list函数返回查询集的子类,该子类克隆原始查询集的大部分属性。但是,它不复制缓存:

代码语言:javascript
复制
print(queryset._result_cache)
# [<MyModel: 0>, <MyModel: 2>, <MyModel: 2> ... ]

print(queryset.values_list("id", "name")._result_cache)
# Nothing
票数 0
EN

Stack Overflow用户

发布于 2021-03-22 06:50:29

检查这两条语句之后生成的查询,会发现数据库第二次被击中。试试这个:

代码语言:javascript
复制
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)来查看实际使用的查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66740866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档