我有一个Django模型,就像这样…
class Example(models.Model):
title = models.CharField(...)
...
我尝试比较两个值——用户更改前的title
字段和更改后的title
字段。我不想一次将两个值都保存在数据库中(只需要一个title
字段(,所以我想使用pre_save
和post_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)