簡體   English   中英

Django pre_save 信號:檢查實例是否創建未更新,kwargs['created'](仍然)是否存在?

[英]Django pre_save signal: check if instance is created not updated, does kwargs['created'] (still) exist?

我正在使用 Django 的 pre_save 信號來實現 auto_now_add。 互聯網上有很多關於為什么應該或不應該自己實施它的討論。 我不欣賞對此的評論。 無論是我是否應該重寫保存功能(我有很多使用 auto_now_add 的模型,所以使用信號是有意義的)。

我的問題是:
我想檢查實例是否已創建或更新。 根據互聯網上的一些消息來源,這可以通過測試kwargs['created']是否為真來完成。 但是,即使實例是新創建的, 'created'也不會出現在我的kwargs中。 我只是想知道它是否曾經存在過或者它神奇地消失了。 我知道我也可以測試是否設置了kwargs['instance'].id (這實際上對我有用),但我想知道 kwargs['created'] 是否仍然存在。

主鍵屬性通常在實例第一次保存時由數據庫分配。 所以你可以使用類似if instance.pk is None

根據最新的 Django 文檔pre_save不會發送created參數。 但是Post_save確實如此 我找不到自版本 1.0以來created的信號發送的任何參考。

我不確定這是否是推薦的方法,但@Radagast 的方法對我不起作用(不確定是否因為我使用自定義 Pk)。

我嘗試了以下方法(不確定這是否是最好的方法):

@receiver(pre_save, sender=YourModelName, weak=False, )
def presave_payment_model_check(sender, instance=None, created=False, **kwargs):
    #Reference: https://stackoverflow.com/questions/11561722/django-what-is-the-role-of-modelstate
    if instance._state.adding:
        # we would need to create the object
        print "Creating an object"
    else:
        #we are updating the object
        print "Updating an object"
    

參考: Django:ModelState的作用是什么?

您可以通過以下方式輕松檢查是否在 pre_save中創建或更新了實例:

@receiver(pre_save, sender=MyModel)
def pre_save_user(sender, instance, **kwargs): 
    if instance._state.adding:
        print ('Instance created!')
    else:
        print ('Instance updated!')

用 Django 3.0 測試。

使用 instance._state.adding 是最合乎邏輯的方法,因為無論主鍵是否已分配,您都可以判斷模型狀態是否存在。

你可以試試這個。

@receiver(pre_save, sender=User)
def user(instance, *args, **kwargs):
    if instance.id != None:

當 pk 是自定義 uuid 字段時,instance.pk 也將在創建時具有值。

我正在使用Django的pre_save信號來實現auto_now_add。 互聯網上有很多關於您為什么應該或不應該自己實施的討論。 我不喜歡對此發表評論。 無論我是否應該重寫save函數(我都有很多使用auto_now_add的模型,因此使用信號很有意義)。

我的問題是:
我想檢查實例是否已創建或更新。 根據互聯網上的一些消息來源,這可以通過測試kwargs['created']是否為True來完成。 但是,即使實例是新創建的, 'created'也不會出現在我的kwargs 我只是想知道它是否曾經存在過,或者它已經神奇地消失了。 我知道我也可以測試是否設置了kwargs['instance'].id (實際上對我有用),但是我想知道kwargs ['created']是否仍然存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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