Django 如何在pre_save功能中获取旧值和新值

django how to get old value and new value in pre_save fucntion

提问人:Tiancheng Liu 提问时间:8/10/2018 最后编辑:saeed foroughiTiancheng Liu 更新时间:6/15/2020 访问量:10511

问:

想象一下,我有一个名为 的模型,它有一个名为 的字段。如何在信号中获取以前的值和新值?Anamepre_save

@receiver(pre_save, sender=A)
def signal_product_manage_latest_version_id(
        sender, instance, update_fields=None, **kwargs):
    if 'name' in update_fields:
        print(instance.name)

当我调用以下内容时,是旧值还是新值?name

a = A.objects.create(name="John")
a.name = "Lee"
a.save()
django django-orm django-signals

评论


答:

21赞 JPG 8/10/2018 #1

来自文档 正在保存的实际实例。

您将通过使用 .get() 方法显式调用它来获取 A 的旧实例,如下所示:
instance

@receiver(pre_save, sender=A)
def signal_product_manage_latest_version_id(sender, instance, update_fields=None, **kwargs):
    try:
        old_instance = A.objects.get(id=instance.id)
    except A.DoesNotExist:  # to handle initial object creation
        return None  # just exiting from signal
    # your code to with 'old_instance'

评论

3赞 Vladimir Chub 8/30/2019
还要记住,如果对象是第一次保存,它的旧版本不会显示在数据库中,因此会导致异常。objects.get
0赞 JPG 8/30/2019
@zen11625 谢谢你的信息。我已经更新了处理这种情况的答案