确定 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” 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

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

    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 它会导致深度