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



我有一个Django模型,就像这样…

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

我尝试比较两个值——用户更改前的title字段和更改后的title字段。我不想一次将两个值都保存在数据库中(只需要一个title字段(,所以我想使用pre_savepost_save方法来做到这一点。是否可以在保存之前获取标题,然后保持该值以传递到post_save方法中?

pre_save和postrongave方法看起来像…

@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和postrongave都发生在调用save((之后。我想要的是类似pre_save((的东西,但在实际的save方法被调用之前。我在模型上设置了这一点,这样无论实例是从(管理员还是用户视图(保存的,都可以访问要执行的逻辑

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

@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版本测试过它。请告诉我它是否仍然有效。

只有当"save"方法成功通过时,我们才能说对象已经更改,所以post_save可以确保模型对象已经更新。

在模型类实例上设置动态属性可以完成这项任务,因为相同的实例从pre_save传递到postrongave。

def set_flag_on_pre_save(sender, instance, *args, **kwargs):
# Check here if flag setting condition satisfies
set_the_flag = true
if set_the_flag:  
instance.my_flag=0

def check_flag_on_post_save(sender, instance, *args, **kwargs):
try:
print(instance.my_flag)
print('Flag set') 
except AttributeError:
print('Flag not set')

pre_save.connect(set_flag_on_pre_save, sender=ModelClass)
post_save.connect(check_flag_on_post_save, sender=ModelClass)

相关内容

  • 没有找到相关文章

最新更新