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

class Example(models.Model):
    title = models.CharField(...)
    ...


我正在尝试比较两个值-用户更改之前的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...


任何想法将不胜感激!

编辑

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

最佳答案

使用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 ...


这个技巧是很久以前提出的。我尚未使用最新的Django版本进行测试。请让我知道它是否仍在工作。

10-07 15:35