2017-06-15 58 views
2

我有以下兩個Django模型:保存模型嘗試創建新的對象

class A: 
    uuid = CharField(primary_key=True) 
    code = CharField(unique=True) 

class B: 
    uuid = CharField(primary_key=True) 
    a = ForeignKey(A, related_name='bs') 

    def save(**kwargs): 
     self.a.save(**kwargs) 
     super(B, self).save(**kwargs) 

如果我想在測試情況下使用它們,寫這樣的功能:

def setUp(): 
    a = A.objects.create(uuid='a') 
    b = B.objects.create(uuid='b', a=a) 

我得到的以下錯誤:

UNIQUE constraint failed: app_name_a.code 

它看起來像在B的保存方法,它試圖創建另一個具有相同值而不是你的A更新現有的實例。爲什麼會這樣?我正在使用Python 3.5和Django 1.8.14。

順便說一句:我想保存父母的原因是我有更新updated_at時間戳的保存方法中的功能。

回答

1

的問題是在kwargs你傳遞到A.save()

self.a.save(**kwargs) 

如果你看一下documentation,你會看到force_insert發送True(因爲A此刻正在創建)當你嘗試保存B,因此Django將不會檢查是否已創建self.a,因爲您同時通過force_insertTrueself.a.save()

def save(self, *args, **kwargs): 
    self.a.save() 
    super(B, self).save(*args, **kwargs) 
+0

這似乎在文檔中,你指的是默認的是'force_insert =假:

爲了解決這個問題,你不應該爲了讓Django的就創建或更新self.a決定通過**kwargs ',但實際上,當我打印'kwargs'時,我發現它的確設置爲True! – physicalattraction

+1

@physicalattraction它會被髮送'True',因爲Django基於'self.pk'設置該值爲'None'或不。 – ozgur

相關問題