保存模型后,我使用Django的POST_SAVE信号执行一些语句.

class Mode(models.Model):
    name = models.CharField(max_length=5)
    mode = models.BooleanField()


from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Mode)
def post_save(sender, instance, created, **kwargs):
        # do some stuff
        pass

现在,我想根据mode字段的值是否已更改来执行一条语句.

@receiver(post_save, sender=Mode)
def post_save(sender, instance, created, **kwargs):
        # if value of `mode` has changed:
        #  then do this
        # else:
        #  do that
        pass

我查看了一些软件线程和一个博客,但没有找到解决方案.他们都在try 使用pre_save方法或表单,这不是我的用例.django文档中的https://docs.djangoproject.com/es/1.9/ref/signals/#post-save没有提到直接实现这一点的方法.

下面链接中的答案看起来很有希望,但我不知道如何使用.我不确定最新的Django版本是否支持它,因为我使用ipdb进行调试,发现instance变量没有下面答案中提到的属性has_changed.

Django: When saving, how can you check if a field has changed?

推荐答案

将其设置在您的型号的__init__上,这样您就可以访问它.

def __init__(self, *args, **kwargs):
    super(YourModel, self).__init__(*args, **kwargs)
    self.__original_mode = self.mode

现在您可以执行如下操作:

if instance.mode != instance.__original_mode:
    # do something useful

Django相关问答推荐

Django-HTMX:呈现到不同目标的表单验证错误

Django和静态文件

覆盖保存以创建范围的多个对象()

Django查询一个查询集的输入结果,以查找没有出现在另一个模型中的对象

Django rest框架:自定义对象权限不起作用

在 Django Rest Framework 视图中,request.user 是在请求​​到达视图之前进行数据库调用还是数据库调用发生?

- 不支持的操作数类型:DateField和DateField

基于每个条目的 Django Queryset 过滤

如何运行克隆的 Django 元素?

如何缓存 Django Rest Framework API 调用?

在 Django 的 ORM 中访问存储过程的最佳方法是什么

测试 Django ModelForm 是否有实例

Django:如何从模板调用视图函数?

如何使用基于类的视图处理表单(通过 get 或 post)?

在 Django 中注册用户的最佳方法

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

Django - 每 x 秒运行一个函数

在 Django shell 启动时自动导入模型

Jinja2中的多级模板继承?