2012-04-03 124 views
8

我使用南遷移我的django模型。南部有一個令人討厭的錯誤。它不會在Postgres數據庫中設置默認值。例如:django南遷移,沒有設置默認

created_at = models.DateTimeField(default = datetime.now) 
tag_id = models.PositiveIntegerField(default = 0) 

南會添加這些2場數據庫,但未按規定設置的默認值,這需要手動完成。

是否有這個bug補丁的任何?

UPDATE 我已經嘗試設置默認的日期與auto_now_add=True,但也沒有設置默認值。在字段中添加null=True將在南部生成的遷移腳本中添加一個db.alter_column。但只有刪除NOT NULL約束,不添加默認值。同爲整數字段

回答

11

這是不是一個錯誤,在南方或其他地方。

我想你感到困惑的默認值在Django是如何工作的一般。 Django不會在數據庫模式中設置默認值。當創建新實例時,它直接在Python中應用它們。您可以通過執行manage.py sqlall來驗證這一點,並看到生成的SQL不包含default屬性。

+2

如何在Postgres數據庫中執行默認值。我有apis直接與django創建的數據庫進行協商。他們預計違約將到位。 – jerrymouse 2012-04-03 11:12:24

+5

您必須使用自定義SQL來自己修改模式。您可以通過將SQL傳遞給['db.execute'](http://south.aeracode.org/docs/databaseapi.html#db-execute)在South內部執行此操作。 – 2012-04-03 11:46:59

+3

Daniel只是因爲Django試圖阻止用戶在模式級別更改字段默認值,這並不意味着他們不應該能夠。我已經發布了一個實際的解決方案。 – galarant 2013-01-22 03:20:38

21

如果您生成自動在您的遷移使用:

./manage.py schemamigration app_name --auto 

然後,你需要做一個小編輯到遷移之前,實際應用它。進入產生遷移(應該叫像APP_NAME /遷移/ 000X__auto_add_field_foo.py),並尋找論據:在db.add_column通話

keep_default=False 

。只需將其更改爲:

keep_default=True 

除了任何現有行之外,Django現在將您的默認值應用於實際模式。如果South有某種設置來默認生成這個參數爲True,但是沒有這樣的運氣,那將會很棒。每次都需要進行編輯。

+0

+1比編寫自定義SQL – 2013-03-28 17:50:11

+5

+1容易得多。不幸的是['keep_default'在南0.8.1中已棄用](http://south.readthedocs.org/en/latest/releasenotes/0.8.1.html#keep-default-fully-fully-deprecated) – Pankrat 2013-07-01 10:06:43

+0

該死的,Pankrat是對的... – galarant 2013-07-01 15:52:58

2

如前面的答案中提到,在Django默認的機制是在模型類中實現,而不是相關向南遷移。

此外,由於南0.8,the keep_default flag is deprecated,並不會默認值添加到您的模型。

我做些什麼來解決這個問題是寫一個自定義的遷移添加的默認值。你可以通過創建一個單獨的data migration

./manage.py datamigration your_app_name migration_name 

和下面的行添加到forwards功能:

orm.YourModel.objects.update(field_name = DEFAULT_VALUE) 

或者,而不是創建一個新的遷移,您可以修改原來的遷移:

  1. no_dry_run = True添加到類本身(因此您將有權訪問ORM)。
  2. orm.YourModel.objects.update(field_name = DEFAULT_VALUE)添加到forwards函數的末尾。

這樣您就不必寫回向遷移,因爲您已經有了原始的刪除列。