[英]Django - Pass value from pre_save to post_save methods on model
我有一個像這樣的Django模型...
class Example(models.Model):
title = models.CharField(...)
...
我正在嘗試比較兩個值-用戶更改之前的title
字段和之后的title
。 我不想一次將兩個值都保存在數據庫中(只需要一個title
字段),所以我想使用pre_save
和post_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 ...
我們只能說,如果“保存”方法成功通過,則對象已更改,因此post_save
可以確保模型對象已更新。
在模型類實例上設置fly屬性可以完成此任務,因為將同一實例從pre_save傳遞到post_save。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.