Django 到底什么时候运行查询?

2024-02-11

虽然我了解 Django 的 QuerySet 和延迟执行的高级思想,但我没有在 Django (3.1.2) 源代码中看到查询执行是如何触发的(即,数据库被命中)。例如,根据Django 文档 https://docs.djangoproject.com/en/3.1/topics/db/queries/#retrieving-a-single-object-with-get, get()查询似乎立即命中数据库。但是查看源代码(django.db.models.query):

    def get(self, *args, **kwargs):
        """
        Perform the query and return a single object matching the given
        keyword arguments.
        """
        clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
        if self.query.can_filter() and not self.query.distinct_fields:
            clone = clone.order_by()
        limit = None
        if not clone.query.select_for_update or connections[clone.db].features.supports_select_for_update_with_limit:
            limit = MAX_GET_RESULTS
            clone.query.set_limits(high=limit)
        num = len(clone)
        if num == 1:
            return clone._result_cache[0]
        if not num:
            raise self.model.DoesNotExist(
                "%s matching query does not exist." %
                self.model._meta.object_name
            )
        raise self.model.MultipleObjectsReturned(
            'get() returned more than one %s -- it returned %s!' % (
                self.model._meta.object_name,
                num if not limit or num < limit else 'more than %s' % (limit - 1),
            )
        )

我不知道在哪里clone(这是一个QuerySet对象)将其发送到数据库引擎query (i.e., self._query其中包含实际的Query对象被解析为 SQL)并以某种方式将结果缓存在_result_cache。事实上,当我尝试单步执行代码时,在某个时刻,self._result_cache“神奇地”填充了查询结果。我从来没有接触过任何与 SQL 相关的代码,比如results_iter() or execute_sql() in django.db.models.sql.compiler,我认为必须调用它才能与数据库后端交互?我的猜测是 Django 正在运行不同的进程/线程,而 PyCharm 仅单步执行主线程?如果是这种情况,有人可以指出一些相关的代码吗?我自己似乎无法从 Google 找到任何帮助。谢谢!

编辑: 通过查看代码我知道_fetch_all()可以触发数据库命中,因为它连接到ModelIterable,它执行 SQL 命令并将结果处理为 Python 对象,但为什么我从未涉足过这个方法?我想更好的问题是,什么时候_fetch_all()曾经打过电话吗?


从您添加的代码中,看到这一行:

num = len(clone)

人们可以看到我们正在调用len在查询集上。根据当查询集被评估时 - Django 文档 https://docs.djangoproject.com/en/3.1/ref/models/querysets/#when-querysets-are-evaluated:

len(). A QuerySet当您致电时进行评估len()在上面。正如您所期望的,这将返回结果列表的长度。

进一步展望源代码 - GitHub https://github.com/django/django/blob/f5a22442176878d07e80ae5ba0af1dd8d6910fbd/django/db/models/query.py#L261-L263 len会打电话_fetch_all()正如您正确假设的那样,结果来自:

def __len__(self):
    self._fetch_all()
    return len(self._result_cache)

上面引用的文档还指出了查询集何时被准确评估。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 到底什么时候运行查询? 的相关文章

  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • 为什么方法无法访问类变量?

    我试图理解Python中的变量作用域 除了我不明白为什么类变量不能从其方法访问的部分之外 大多数事情对我来说都很清楚 在下面的例子中mydef1 无法访问a 但如果a可以在全局范围 类定义之外 声明 class MyClass1 a 25
  • 如何用spaCy获取依赖树?

    我一直在尝试寻找如何使用 spaCy 获取依赖树 但我找不到任何有关如何获取树的信息 只能在如何导航树 https spacy io usage examples subtrees 如果有人想轻松查看 spacy 生成的依赖关系树 一种解决
  • DataFrame 中的字符串,但 dtype 是对象

    为什么 Pandas 告诉我我有对象 尽管所选列中的每个项目都是一个字符串 即使在显式转换之后也是如此 这是我的数据框
  • 返回不包括指定键的字典副本

    我想创建一个函数 返回字典的副本 不包括列表中指定的键 考虑这本词典 my dict keyA 1 keyB 2 keyC 3 致电without keys my dict keyB keyC 应该返回 keyA 1 我想用一行简洁的字典理
  • 无法安装时间模块

    我试过了pip install time and sudo H pip install time 但我不断收到错误 找不到满足要求时间的版本 从 版本 未找到时间匹配的发行版 我正在 PyCharm 中工作 但真正没有意义的是我可以在 Py
  • 如何用xlrd读取公式

    我正在尝试做一个解析器 它读取几个 Excel 文件 我通常需要位于行底部的值 您可以在其中找到所有上部元素的总和 因此 单元格值实际上是 sum 或 A5 0 5 可以说 对于使用 Excel 打开此文件的用户来说 它看起来像一个数字 这
  • 如何从网站中提取冠状病毒病例?

    我正在尝试从网站中提取冠状病毒 https www trackcorona live https www trackcorona live 但我得到了一个错误 这是我的代码 response requests get https www t
  • 以编程方式将列名称添加到 numpy ndarray

    我正在尝试将列名称添加到 numpy ndarray 然后按名称选择列 但这不起作用 我无法判断问题是在添加名称时出现 还是在稍后尝试调用它们时出现 这是我的代码 data np genfromtxt csv file delimiter
  • Python 相当于 Bit Twiddling Hacks 中的 C 代码?

    我有一个位计数方法 我正在尝试尽可能快地实现 我想尝试下面的算法位摆弄黑客 http graphics stanford edu seander bithacks html CountBitsSetParallel 但我不知道 C 什么是
  • 这可能是因为 cuDNN 初始化失败,因此请尝试查看上面是否打印了警告日志消息。 [操作:Conv2D]

    我在 anaconda 中安装了 TensorFlow GPU 2 0 当我安装它并导入包 然后运行我的 CNN 模型时 它工作正常 但当我尝试运行训练模型时 出现错误 这是我的错误报告 Epoch 1 50 UnknownError Tr
  • 如何在 Keras 中使用部分输入进行训练,其余部分用于损失函数

    我是 Keras 新手 正在尝试实现神经网络机器学习模型 输入张量看起来像 X1 X2 和输出 Y 注意 X1 和 X2 是相关的 在模型中 只有 X1 将用于训练 但 X1 和 X2 都将传递给损失函数 该损失函数是 X1 X2 y pr
  • 别碰我的女人

    我讨厌的一件事迪斯图尔斯 http docs python org distutils 我猜他是邪恶的人 他这样做了 https github com python cpython blob 300dd552b15825abfe0e367a
  • 将具有不同大小的行的数据加载到 Numpy 数组中

    假设我有一个包含如下数据的文本文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 如何将它加载到 numpy 数组中 使其看起来像这样 1 2 3 4 5 0 6 7 8 0 0 0 9 1
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • 将参数传递给 __enter__

    刚刚学习 with 语句尤其是这篇文章 http effbot org zone python with statement htm 问题是 我可以传递一个参数给 enter 我有这样的代码 class clippy runner def
  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • DRF:以编程方式从 TextChoices 字段获取默认选择

    我们的网站是 Vue 前端 DRF 后端 在一个serializer validate 方法 我需要以编程方式确定哪个选项TextChoices类已被指定为模型字段的默认值 TextChoices 类 缩写示例 class PaymentM
  • 使用Python重命名目录中的多个文件

    我正在尝试使用以下 Python 脚本重命名目录中的多个文件 import os path Users myName Desktop directory files os listdir path i 1 for file in files
  • 如何将 Pandas Dataframe 中的字符串转换为字符列表或数组?

    我有一个名为的数据框data 其中一列包含字符串 我想从字符串中提取字符 因为我的目标是对它们进行一次性编码并使之可用于分类 包含字符串的列存储在预测因子如下 predictors pd DataFrame data columns Seq

随机推荐

  • 在 wpf c# 中的某些控件中禁用全局 KeyBindings

    我有一个主窗口 其中有一些键绑定 如下所示
  • 如何使用 Python 查找我的数据属于哪个集群?

    我刚刚对我的数据运行了 PCA 然后运行了 K 均值聚类算法 运行算法后我得到了 3 个聚类 我试图找出我的输入属于哪些集群 以便收集有关输入的一些定性属性 我的输入是客户 ID 用于聚类的变量是某些产品的支出模式 下面是我为 K 均值运行
  • 使用 OpenCV 混合多个图像

    使用python与OpenCV混合多个图像的方法是什么 我遇到了以下片段 img cv2 addWeighted mountain 0 3 dog 0 7 0 on https docs opencv org 3 4 d5 dc4 tuto
  • 在 Windows JRE 中导入 StartCom CA 证书

    我有一个 Java 应用程序访问使用 StartCom SSL 证书的服务 为此 我需要将 StartCom CA 证书添加到 Java 的信任库中 因为默认情况下它们还不在那里 我已经使用这些命令在 Linux 上成功完成了此操作 sud
  • 在 TypeScript 中覆盖接口的属性

    我知道禁止在扩展接口中覆盖接口的属性 修改其类型 我正在寻找一种替代解决方案 该解决方案允许我不复制第一个界面的内容 它非常大 下面是我的第一个天真的方法 鉴于该基本接口 interface OrginalInterface title s
  • 如何在Cloud Firestore中完成WHERE IN查询[重复]

    这个问题在这里已经有答案了 我试图弄清楚如何根据值是否位于我客户端的数组中来返回查询 到目前为止我还没有发现任何关于这个问题的信息 这可能吗 Firestore 现在支持 IN 查询 公告 https firebase googleblog
  • Hibernate:排序多对多映射

    考虑以下带有 JPA 注释的映射 ManyToMany cascade CascadeType ALL JoinTable name infotype validations joinColumns JoinColumn name info
  • 关闭按钮的背光

    我正在开发一个可能在晚上使用的 Android 应用程序 因此 我需要关闭按钮的背光 我怎样才能做到这一点 在我自己的手机上 背光会在一段时间后关闭 但在摩托罗拉 Droid 上 我认为不会发生这种情况 我正在使用唤醒锁来保持屏幕打开 我应
  • 如何在普通表和 fts3 表之间创建触发器?

    我在 FTS3 表和普通数据库表之间切换时遇到问题 我的应用程序非常简单 允许用户将联系人添加到数据库 他们可以搜索与搜索查询匹配的联系人 为什么我使用 fts 表 然后将结果显示在带有 onItemclicklistener 的列表上 但
  • 使用 PACKET_MMAP 和 PACKET_TX_RING 发送数据比“正常”(不使用)慢

    我正在用 C 语言编写一个流量生成器 使用 PACKET MMAP 套接字选项来创建环形缓冲区以通过原始套接字发送数据 环形缓冲区充满了要发送和发送的以太网帧sendto叫做 环形缓冲区的全部内容通过套接字发送 这应该比在内存中拥有缓冲区并
  • 如何使用refresh_token获取新的access_token(使用Flask-OAuthLib)?

    我正在构建一个网站 后端Flask框架 http flask pocoo org 我在其中使用Flask OAuthlib https flask oauthlib readthedocs org en latest 与谷歌进行身份验证 身
  • 在 Twitter API 中使用正则表达式

    我正在使用 Python 中的 Tweepy 库来搜索推文 我想知道是否可以使用正则表达式来搜索推文 我正在使用以下代码 query ARNOLD or SYLVESTER for tweet in tweepy Cursor api se
  • 缓存 Android 中 MapView 上正在绘制的内容

    我正在为我的大学校园开发一个应用程序 该应用程序在 MapView 中显示校园 然后使用geopoints在mapView上使用draw方法绘制校园建筑物的轮廓 该类延伸Overlay http code google com androi
  • EntityGraph - 您必须在描述符处定义提取组管理器才能在查询上设置提取组

    我想在 EclipseLink 和 GlassFish 中使用实体图 Entity NamedQueries NamedQuery name invoice all query SELECT i FROM Invoice i NamedEn
  • kubectl 端口转发多个服务

    我一直在尝试使用以下命令转发多个端口 kubectl port forward deployment service1 8080 8080 kubectl port forward deployment service2 8081 8081
  • 未找到“属性”段的资源

    当使用 ADO Net Data Services 客户端通过调用刷新实体时LoadProperty ctx BeginLoadProperty this Owner IAsyncResult ar gt 如果该属性是 它会在服务器上引发错
  • 工作流程中的 Dynamics CRM 当前日期占位符

    我已将工作流程附加到具有到期日期和时间的实体 那么指示当前时间的适当占位符是什么 CURRENT TIME Sultan 您的问题有点模糊 但如果您通过编辑器谈论 Dynamics CRM 工作流程 则工作流程运行的时间就是执行时间 为此
  • 无法将字符串转换为 pandas 中的浮点数(ValueError)

    我有一个从 JSON 输出创建的数据框 如下所示 Total Revenue Average Revenue Purchase count Rate Date Monday 1 304 40 CA 20 07 CA 2 345 1 54 存
  • 如何在 Python 中从给定 CDF 的分布中采样

    我想从概率分布中抽取样本CDF https en wikipedia org wiki Cumulative distribution function 1 e x 2 python scipy 等中有没有方法 使您能够从仅给定 CDF 的
  • Django 到底什么时候运行查询?

    虽然我了解 Django 的 QuerySet 和延迟执行的高级思想 但我没有在 Django 3 1 2 源代码中看到查询执行是如何触发的 即 数据库被命中 例如 根据Django 文档 https docs djangoproject