gpt4 book ai didi

python - 识别 django post_save 信号中更改的字段

转载 作者:行者123 更新时间:2023-11-28 19:35:25 24 4
gpt4 key购买 nike

我正在使用 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

我查看了一些 SOF 线程和博客,但找不到解决方案。他们都试图使用 pre_save 方法或表单,这不是我的用例。 https://docs.djangoproject.com/es/1.9/ref/signals/#post-save在 django 文档中没有提到执行此操作的直接方法。

下面链接中的答案看起来很有希望,但我不知道如何使用它。我不确定最新的django版本是否支持它,因为我使用ipdb调试这个,发现instance变量没有属性has_changed 如以下答案中所述。

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

最佳答案

如果你想比较保存操作前后的状态,你可以使用 pre_save 信号,它为你提供实例,因为它在数据库更新后应该变成这样,在 pre_save 中你可以读取数据库中实例的当前状态并根据差异执行一些操作。

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


@receiver(pre_save, sender=MyModel)
def on_change(sender, instance: MyModel, **kwargs):
if instance.id is None: # new object will be created
pass # write your code here
else:
previous = MyModel.objects.get(id=instance.id)
if previous.field_a != instance.field_a: # field will be updated
pass # write your code here

关于python - 识别 django post_save 信号中更改的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36719566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com