2016-06-27 26 views
1

我正在模型的pre_save信號中工作,我不知道如何檢查記錄是INSERT還是UPDATE。下面的代碼(不正常):Django pre_save信號:我怎麼知道它是插入還是更新

@receiver(pre_save, sender=Person) 
def pre_save_person(sender, instance, **kwargs): 

    if not instance.pk: 
     print 'INSERT !!!!!!' 
    else: 
     print 'UPDATE !!!!!!' 

你能幫我嗎?該項目使用django 1.8.7。

感謝所有幫助

+0

這樣會工作,只是if條件是錯誤的方式。 –

+0

@DanielRoseman是的,我看到如果條件錯了。但它不管用。 Instance.pk總是存在 –

+1

如果pk存在,那麼Django不知道它是更新還是插入。在這種情況下,Django會嘗試更新,如果失敗則返回插入。如果您的應用程序在保存實例之前設置了pk,那麼您只能通過查詢db來查找匹配的pk。 – knbk

回答

2

繼@ knbk評論,instance.pk將始終存在於這一點上。你必須檢查這個instance.pk是否存在於數據庫中:

@receiver(pre_save, sender=Person) 
def pre_save_person(sender, instance, **kwargs): 

    num = Person.objects.filter(pk=instance.pk).count() 
    if num == 0 : 
     print 'INSERT !!' 
    else: 
     print 'UPDATE !!' 
+0

這導致了額外的數據庫查詢。確實,基於主鍵檢索單個項目的速度非常快,但仍然可以儘可能避免額外的查詢。 – e4c5

+0

@ e4c5好的提示和我在想同樣的事情。在這種情況下你會如何避免額外的查詢? – Jarad

0

if instance.pk is None: print "inserting" else: print "updating"

嘗試在所有情況下,這不會工作,我建議使用post_save,你必須在標誌創建除非特別需要pre_save

+0

感謝您的回答。它不起作用,instance.pk總是在那裏,我不能使用post,因爲我正在創建相關模型的記錄 –

相關問題