2011-05-27 79 views
19

默認值我有以下Django型號代碼:Django模型:爲

status = models.PositiveIntegerField(default = 0b000) 
comments_allowed = models.BooleanField(default = True) # whether comments are allowed to this post 

但我預計,它會生成SQL像

`status` integer NOT NULL default '4', 
`comments_allowed` bool NOT NULL default TRUE 

這是不會發生,當我運行manage.py sqlall appname它生產:

`status` integer UNSIGNED NOT NULL, 
`comments_allowed` bool NOT NULL 

Delving into Django的代碼和谷歌搜索給了我什麼,但詹姆斯班納特的評論認爲default不會影響生成SQL,但需要爲Django管理員。即使如此,我如何獲得所需的效果?

Django版本是1.3.0最終

+0

是'default'也可以分配可調用的對象將事實表明它主要在模型實例創建期間使用。除了手動運行'SQL ALTER'命令,AFAIK不可能做你想做的事情。 – 2011-05-27 14:38:53

+0

謝謝,肖恩。我期待這個答案,因爲我的谷歌搜索沒有帶來任何結果。 – Nemoden 2011-05-27 14:46:41

+3

相關故障單:https://code.djangoproject.com/ticket/470 – Medorator 2013-09-23 19:11:16

回答

14

注意,default參數也可以採取調用對象:https://docs.djangoproject.com/en/dev/ref/models/fields/#default。這當然是一種無法在SQL中重現的行爲!所以Django不可能爲每種可能的情況生成SQL。爲了簡單和一致性,他們選擇不爲任何情況生成SQL。

+3

那麼,這是SQL中最有用的東西之一 - 在創建列時提供默認值。 Django'太糟糕了:( – Nemoden 2011-05-27 14:45:48

+0

@Nemoden你可以隨時手動改變你的SQL,Django增加了這個功能,使它更加靈活,與Django和Python中的很多東西一樣,如果你不喜歡它,你可以改變它! – NickAldwin 2011-05-27 14:47:09

+7

當然,是的......但是......我只是感到失望,從框中提供它並不難,對嗎?:)如果!callable在創建列語句中添加默認值......並且它確實令人困惑的原因是你認爲'Django'菜鳥'好吧,好...我們在這裏有一個默認選項,所以我們提供一些默認值',它什麼也不做......首先你認爲「哇,Django模型是如此酷「,現在你們都是」Wheee ....他們不是那麼酷「:)實際上,沒關係。我現在只是不高興:) – Nemoden 2011-05-27 14:55:10

9

唯一永久的解決方案是修補Django的源,特別是分貝/後端/ creation.py:

查找:

if f.primary_key: 
    field_output.append(style.SQL_KEYWORD('PRIMARY KEY')) 
elif f.unique: 
    field_output.append(style.SQL_KEYWORD('UNIQUE')) 

添加後:

if(f.default != models.fields.NOT_PROVIDED): 
    field_output.append(style.SQL_KEYWORD('DEFAULT ' + str(f.default))) 

(來源: http://www.supermind.org/blog/671/django-not-setting-default-column-value-in-mysql

或者(最好),如果你使用南方,你可以只執行一些額外的SQL中遷移的db.create_table後:

的MySQL:

db.execute("ALTER TABLE yourapp_yourmodel MODIFY status int Default '4'") 

Postgres的:

db.execute("ALTER TABLE yourapp_yourmodel ALTER COLUMN status SET DEFAULT 4") 

+0

沒錯!不僅我對此感到不安:)感謝您的解決方案。我不能接受它,因爲它是一種骯髒骯髒的黑客攻擊。所以現在我要用'alter table mytable修改列狀態bool not null default TRUE' – Nemoden 2011-05-27 15:08:27

+1

嗯......我在回答中說了很多,並且還建議您找到一種替代方法,如使用South來自動添加該專欄,因爲修補資料不是一個好主意。這似乎正是你打算做的,無論是通過南或手動。 – 2011-05-27 15:15:13

+0

我很困惑...有人向Django提交了補丁嗎? – mlissner 2012-04-29 21:45:12