2017-03-12 81 views
0

新的記錄,我有以下型號Django的創造,而不是更新

class FooBar(models.Model): 
    FOOBAR_ID = models.AutoField(primary_key=True) 
    foo = models.CharField(max_length=255) 
    bar = models.CharField(max_length=255) 

此外,我創建了一個表格,讓我編輯FooBar的現有實例。我想在更改foo時更新現有記錄,但在更改欄時創建新記錄。

我想出一個好辦法去將覆蓋保存方法,因爲它會避免做一些額外的查詢數據庫,這是我通過添加下面我FooBar的模型來完成。

__original_bar = None 

def __init__(self, *args, **kwargs): 
    super(FooBar, self).__init__(*args, **kwargs) 
    self.__original_bar = self.bar 

def save(self, force_insert=False, Force_update=False, *args, **kwargs): 
     if self.bar != self.__original_bar: 
      super(FooBar, self).save(force_insert=True, force_update=False, *args, **kwargs) 
      self.__original_bar= self.bar 
     else: 
      super(FooBar, self).save(force_insert=False, force_update=True, *args, **kwargs) 

當我更新富一切正常,但是當我更新欄顯示以下錯誤:

密鑰( 「FOOBAR_ID」)=(2)已存在。

我顯然是完全錯誤的force_insert做什麼。我如何強制它在保存中創建新記錄?

回答

1

您可以將您的主鍵設置爲None,並且Django自動創建新記錄。你可以在docs閱讀更多關於這個。

def save(self, *args, **kwargs): 
    if self.bar != self.__original_bar: 
     self.FOOBAR_ID = None 
     self.__original_bar= self.bar 
    super(FooBar, self).save(*args, **kwargs) 
0

當使用bar時,應該刪除id。在將數據發送到前端之前嘗試刪除它。

發生了什麼事情是,您正嘗試使用已存在的主鍵「Key(」FOOBAR_ID「)=(2)」向數據庫添加新行。

相關問題