python - 如何检查 post_save 中的模型字段是否已更改?
问题描述
如果模型字段之一已更新,我必须在 post_save 中执行一些额外的逻辑,但无法检查它是否已更新。
试图像这样覆盖init方法
def __init__(self, *args, **kwargs):
super(Profile, self).__init__(*args, **kwargs)
self.__old_city = self.city
并在 post_save 检查
if instance.city != instance.__old_city:
#extra logic
但有一个例外
AttributeError:“配置文件”对象没有属性“__old_city”
我做错了什么(除了使用信号:D)?
解决方案
那是因为您使用的名称修饰。
双下划线(名称修饰)
来自 Python 文档:
__spam 形式的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上被替换为 _classname__spam,其中类名是当前类名,前导下划线被去除。这种修饰是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有实例和类变量、方法、存储在全局变量中的变量,甚至是存储在实例中的变量。在其他类的实例上对此类是私有的。
这意味着访问instance.__old_city
您需要使用_className__attribute_name
所以__old_city
会被破坏->
_Profile__old_city
推荐阅读
- android - 我无法在 Recyclerview 项目中打开片段
- c# - 如何在 VB.NET 的文本框中显示文件浏览器对话框路径目录
- node.js - 如何将 Ejabberd 或 MongooseIM 与 Node.js(或 Django)连接起来
- android - 无限滚动的 RecyclerView 的 Android MVVM/ViewModel(加载更多) - 如何处理有关配置更改的数据
- nlp - 通过 Torchtext 使用西班牙语预训练嵌入
- excel - Excel,查找 2 列之间的重复项并显示返回值
- c# - 从 API 返回的标签值
- electron - 导入证书时的电子加载页面
- powershell - Powershell 更改高级系统属性
- python - 使用 Pyro 事件服务器(订阅)是否有任何替代方法 - 通过使用 Pyro4 或其他软件包?