Django - 将值从模型上的 pre_save 传递到 post_save 方法

jay*_*ayt 1 python django

我有一个像这样的 Django 模型......

class Example(models.Model):
    title = models.CharField(...)
    ...
Run Code Online (Sandbox Code Playgroud)

我正在尝试比较两个值 -title用户更改之前的字段和title之后的字段。我不想同时将两个值保存在数据库中(只需要一个title字段),因此我想使用pre_savepost_save方法来执行此操作。是否可以在保存之前获取标题,然后保存该值以传递给方法post_save

pre_save 和 post_save 方法看起来像这样......

@receiver(pre_save, sender=Example, uid='...')
def compare_title_changes(sender, instance, **kwargs):
    # get the current title name here
    x = instance.title

@receiver(post_save, sender=Example, uid='...')
def compare_title_changes(sender, instance, **kwargs):
    # get the new title name here and compare the difference
    x = instance.title # <- new title
    if x == old_title_name: # <- this is currently undefined, but should be retrieved from the pre_save method somehow
        ...do some logic here...
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激!

编辑

正如我所指出的, pre_save 和 post_save 都发生在调用 save() 之后。我正在寻找类似 pre_save() 的东西,但在调用实际的保存方法之前。我在模型上设置了此选项,以便无论从何处保存实例(管理员或用户视图)都可以访问要执行的逻辑

gdl*_*lmx 5

用于Example.objects.get(pk=instance.id)在处理函数中从数据库获取旧标题pre_save

@receiver(pre_save, sender=Example, uid='...')
def compare_title_changes(sender, instance, **kwargs):

    new_title = instance.title  # this is the updated value
    old_title = Example.objects.get(pk=instance.id)
    # Compare the old and new titles here ...
Run Code Online (Sandbox Code Playgroud)

这个技巧很久以前就在这里提出了。我还没有使用最新的 Django 版本对其进行测试。请让我知道它是否仍然有效。