2011-05-27 76 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