确定 django 中的属性是否为“DeferredAttribute”

2024-03-17

上下文


我在 Django Cache Machine 中发现了一个相当严重的错误,导致其失效逻辑在从 Django 1.4 升级到 1.7 后失去理智。

该错误仅限于调用only()在扩展缓存机器的模型上CachingMixin。它会导致深度递归,偶尔会破坏堆栈,但否则会产生巨大的flush_lists缓存机用于模型的双向失效ForeignKey关系。

class MyModel(CachingMixin):
    id = models.CharField(max_length=50, blank=True)
    nickname = models.CharField(max_length=50, blank=True)
    favorite_color = models.CharField(max_length=50, blank=True)
    content_owner = models.ForeignKey(OtherModel)

m = MyModel.objects.only('id').all()

The Bug


该错误发生在以下几行中(https://github.com/jbalogh/django-cache-machine/blob/f827f05b195ad3fc1b0111131669471d843d631f/caching/base.py#L253-L254 https://github.com/jbalogh/django-cache-machine/blob/f827f05b195ad3fc1b0111131669471d843d631f/caching/base.py#L253-L254)。在这种情况下self是一个实例MyModel混合了延迟和非延迟属性:

    fks = dict((f, getattr(self, f.attname)) for f in self._meta.fields
                if isinstance(f, models.ForeignKey))

Cache Machine 进行双向失效ForeignKey关系。它通过循环遍历 a 中的所有字段来做到这一点Model当相关对象失效时,在缓存中存储一​​系列指向需要失效的对象的指针。

指某东西的用途only()在 Django ORM 中,做了一些元编程魔法,用 Django 的覆盖未获取的属性DeferredAttribute执行。正常情况下可以访问favorite_color会调用DeferredAttribute.__get__(https://github.com/django/django/blob/18f3e79b13947de0bda7c985916d5a04e28936dc/django/db/models/query_utils.py#L121-L146 https://github.com/django/django/blob/18f3e79b13947de0bda7c985916d5a04e28936dc/django/db/models/query_utils.py#L121-L146)并从结果缓存或数据源中获取属性。它通过获取未延迟的表示来做到这一点Model有问题并打电话给另一个人only()对其进行查询。

这是循环外键时出现的问题Model并访问它们的值,Cachine Machine 引入了无意的递归。getattr(self, f.attname)延迟的属性上会导致获取Model具有CachingMixin已应用并具有延迟属性。这将重新开始整个缓存过程。

问题


我想打开一个 PR 来解决这个问题,我相信这个问题的答案就像跳过延迟属性一样简单,但我不确定如何做到这一点,因为访问该属性会导致获取过程启动。

如果我拥有的只是 a 实例的句柄Model混合了延迟和非延迟属性,有没有办法确定一个属性是否是DeferredAttribute without访问它?

    fks = dict((f, getattr(self, f.attname)) for f in self._meta.fields
                if (isinstance(f, models.ForeignKey) and <f's value isn't a Deferred attribute))

以下是检查字段是否延迟的方法:

from django.db.models.query_utils import DeferredAttribute

is_deferred = isinstance(model_instance.__class__.__dict__.get(field.attname), DeferredAttribute):

取自:https://github.com/django/django/blob/1.9.4/django/db/models/base.py#L393 https://github.com/django/django/blob/1.9.4/django/db/models/base.py#L393

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

确定 django 中的属性是否为“DeferredAttribute” 的相关文章

随机推荐

  • “推送通知”-反馈、卸载应用

    Apple 推送通知 反馈服务 您如何知道用户何时卸载您的应用程序 这样您就可以从推送服务器中删除他们的设备令牌 你根本不知道 您可以获取对于同一应用程序令牌字符串可能相同的设备标识字符串 并跟踪特定设备的令牌是否已更改 因此 您可以使用新
  • Web Essentials 2017 和 TypeScript 定义生成

    刚刚从 Visual Studio 市场安装了 Web Essentials 2017 但似乎缺少从 C 类创建 TypeScript 定义的功能 在 Web Essentials 2015 中 我将鼠标右键悬停在 C 类文件上 将会出现一
  • JavaScript 对象字面量和数组

    我有以下 JavaScript 代码 oCoord x null y null var aStack oCoord x 726 oCoord y 52 aStack push oCoord oCoord x 76 oCoord y 532
  • file_get_contents 失败并显示“getaddrinfo 失败:没有与主机名关联的地址”

    我正在尝试从另一台主机获取该页面 我按照 hph 手册所述 page file get contents http www example com echo page 但它失败了 在 apache 日志中我得到以下内容 Mon Oct 12
  • 为什么scss/css中文件名前面要加“_”或“_”?

    Why put scss 中文件名前面 filename scss 为什么需要 下划线 是 scss 的部分内容 这意味着样式表将被导入 import 到主样式表 即 styles scss 使用部分的优点是您可以使用多个文件来组织代码 并
  • 教义 2 中的关系

    我完全没有理解教义中的关联 我想知道单向和双向关系有什么区别 学说2中的正方和反方是什么 双向和单向关系 双向和单向与 PHP 对象中的引用有关 如你看到的here http www doctrine project org docs or
  • 使用 CGMutablePath 创建路径会创建指向错误 CGPoint 的线

    我打算在屏幕上用 2D 箭头显示 AR 对象的信息 所以我用了projectPoint获取物体在屏幕中对应的位置 我有这个函数返回将节点的 3D 位置转换为 2D 并CGPoint显示信息文本 func getPoint sceneView
  • 通过socket编程将png图像文件从服务器(桌面)发送到客户端(android)

    我创建了一个 Android 应用程序 其中 Android 应用程序充当客户端 服务器驻留在桌面上 我正在使用套接字编程进行通信 我已成功在客户端和服务器之间传输消息 但我不知道如何传输图像 我需要将图像文件从服务器发送到客户端 不是从客
  • 是否有用于 mp4 文件的 Java API?

    可以使用此处理 M3 文件mp3 SPI 支持 http www javazoom net mp3spi sources html 但我没有找到类似于 mp4 文件的内容 任何帮助 将不胜感激 UPDATE 我想要做的是获取文件的大小 就像
  • 如何在 SwiftUI 中有效过滤长列表?

    我一直在编写我的第一个 SwiftUI 应用程序 它管理图书收藏 它有一个List大约 3 000 个项目 加载和滚动非常高效 如果使用切换控件来过滤列表以仅显示书籍 则更新前 UI 不会冻结二十到三十秒 大概是因为 UI 线程正忙于决定是
  • JavaScript 中的基本正则表达式

    一段时间以来 我一直在尝试理解 JavaScript 中的正则表达式 但它非常复杂 您可以告诉我如何使用正则表达式分别兑换下面 URL 中的每个值 URL first middle last Return var first first v
  • 设计..首次登录后应要求更改密码

    我在我的应用程序中使用设备作为身份验证 我需要在设备中实现功能 首次登录后 用户应要求更改密码 我尝试通过模型 after create update pass change def update pass change self pass
  • 如何强制 Eclipse 请求默认工作空间?

    我注意到安装 cdt 后 Eclipse 总是加载默认工作区 中列出的工作区config ini in osgi instance area default 无论是否打开 Eclipse 都不会询问要打开哪个工作区Prompt for wo
  • 以随机顺序打印数组[重复]

    这个问题在这里已经有答案了 如何在java中以随机顺序打印数组 例子 int myArray 5 4 3 2 1 打印时 结果可能是 3 2 1 4 5 or 4 3 2 5 1 你应该看看写一个费舍尔 耶茨洗牌 http en wikip
  • 不支持的授权类型 Salesforce OAUTH2

    我正在使用 VBA 在 Salesforce 中获得授权 然后最终想要运行 Salesforce 报告并将结果转储到 Excel 中 我已编写以下内容来处理授权 但收到 unsupported grant type 错误 到目前为止我的代码
  • 批处理文件执行文件夹中的所有.exe

    我需要创建一个批处理脚本来运行文件夹中的所有 exe 文件 这必须包括子文件夹 我运行的是Windows 7 批处理文件存储在根文件夹中 我尝试了几种变体但没有成功 两个主要变化如下 REM dir exe S B gt tmpFile R
  • 安卓中的adb是什么?

    当我尝试运行 Android 程序时 出现以下错误 请解释一下到底是什么adb是的 如何重新启动呢 我收到以下错误 The connection to adb is down and a severe error has occured Y
  • 为什么 Android 上的 onCallStateChanged() 在一次调用中会被多次调用?

    我想实现一个像防火墙一样阻止呼叫的应用程序 当我调试我的应用程序时 我发现当有电话进来时 onCallStateChanged 界面中的函数电话状态监听器被调用 3 次 因此 阻止一个调用可能会导致三个日志 我很困惑 my code Ove
  • PLSQL 触发器通过 SQL 加载器触发

    当我们通过 SQL 加载器插入时 表会被触发吗 请详细解释一下 Oracle 将执行INSERT如果使用常规负载则触发 但是当你使用直接负载时不是 http docs oracle com cd E11882 01 server 112 e
  • 确定 django 中的属性是否为“DeferredAttribute”

    上下文 我在 Django Cache Machine 中发现了一个相当严重的错误 导致其失效逻辑在从 Django 1 4 升级到 1 7 后失去理智 该错误仅限于调用only 在扩展缓存机器的模型上CachingMixin 它会导致深度