2011-06-20 37 views
17

我想爲我的模型添加一個ForeignKey字段。爲了實現這一目標,我做了3個步驟:在模式遷移中,什麼應該是null = False字段的默認值,我確信它不會有空值?

  1. 添加了ForeignKeynull=True到我的模型,然後創建一個schemamigration
  2. 創建一個datamigration以便用合理的值填充該外鍵。在應用此遷移之後,我很確定在該字段中沒有留下任何空值的對象。
  3. ForeignKey字段更改爲null=False,然後創建另一個schemamigration

在不過,我有問題第3步

? The field 'MyModel.fkfield' does not have a default specified, yet is NOT NULL. 
? Since you are making this field non-nullable, you MUST specify a default 
? value to use for existing rows. Would you like to: 
? 1. Quit now, and add a default to the field in models.py 
? 2. Specify a one-off value to use for existing columns now 
? Please select a choice: 

嗯......沒有默認值纔有此字段,也可以由現在我敢肯定沒有對象將該字段設爲NULL。所以... 我不知道如何正確回答這個問題。如果可以,我會說「不要設置任何默認值,並且如果在該列中找到任何NULL,則會拋出錯誤。

現在,作爲一個解決方法,爲了克服這個問題,我選擇了選項2,然後使用1作爲一次性默認值。這是一個非常糟糕的解決方案,但至少south不會抱怨它並創建遷移。

  • 將字段更改爲NOT NULL的正確方法是什麼? (使用south
  • south問我一個不應該有的字段的默認值時該怎麼辦?

我使用的是django-1.2south-0.7


相關問題:Django South - turning a null=True field into a null=False field

相關文檔:Part 3: Advanced Commands and Data Migrations

(註腳:在這裏StackOverflow上,我們有兩個標籤,似乎等於對我說: 「Django的南方」 和 「南方」,但我沒有足夠的信譽來暗示同義詞)

回答

15

只是一個念頭:既然這是一個外鍵,你可以設置默認值爲一個你知道永遠不會有的記錄引用記錄,即0或-1。如果south會真的嘗試使用這個默認值,那麼你的db會引發一個錯誤。

+0

我通常在所有字段上都允許NULL。這可能被一些人認爲是不好的做法,但我個人認爲應該在應用程序中而不是在數據庫中強制實施必須具有價值的約束。 –

+7

@ChrisPratt從理論上講,這很好,但是當超過一個行爲良好的應用程序訪問數據庫時會發生什麼? –

相關問題