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

Tia*_*Liu 1 django django-signals django-orm

我有一个模型A,其中有一个名为的字段name。如何获取pre_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)
Run Code Online (Sandbox Code Playgroud)

name当我调用以下代码时,是旧值还是新值?

a = A.objects.create(name="John")
a.name = "Lee"
a.save()
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 6

文档 中保存instance的实际实例。 您将得到旧实例的使用显式调用它的方法,

A.get()

@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'
Run Code Online (Sandbox Code Playgroud)

  • 另请记住,如果第一次保存对象,则旧版本不会出现在数据库中,因此“objects.get”将导致异常。 (3认同)