[英]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
我不確定這是否是推薦的方法,但@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"
您可以通過以下方式輕松檢查是否在 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.