簡體   English   中英

Django-將值從pre_save傳遞到模型上的post_save方法

[英]Django - Pass value from pre_save to post_save methods on model

我有一個像這樣的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版本進行測試。 請讓我知道它是否仍在工作。

我們只能說,如果“保存”方法成功通過,則對象已更改,因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM