Django模型:列的默认值

Nem*_*den 19 mysql django django-models

我有以下Django型号代码:

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

但我预计,它会生成SQL之类的

`status` integer NOT NULL default '4',
`comments_allowed` bool NOT NULL default TRUE
Run Code Online (Sandbox Code Playgroud)

哪个没有发生,当我运行manage.py sqlall appname它时产生:

`status` integer UNSIGNED NOT NULL,
`comments_allowed` bool NOT NULL
Run Code Online (Sandbox Code Playgroud)

深入研究Django代码和谷歌搜索没有给我什么,但詹姆斯班纳特的评论default不会影响生成SQL,但Django管理员需要.即便如此,我如何获得理想的效果?

我的Django版本是1.3.0决赛

小智 14

请注意,该default参数还可以采用可调用对象:https://docs.djangoproject.com/en/dev/ref/models/fields/#default.这当然是一种无法在SQL中复制的行为!因此,Django不可能为每种可能的情况生成SQL.看起来为了简单和一致,他们选择不为任何情况生成SQL.

  • 当然,是的......但是......我只是失望了.从盒子里拿出它并不难,对吧?:)`如果!callable将默认值添加到create column statement` ...而且它真的令人困惑,因为你认为`Django`菜鸟好了,好吧......我们这里有一个默认选项,所以让我们提供一些默认值价值`而且它什么也没做......首先你想到"哇,Django模特真是太酷了"现在你们都"Wheee ......它们并不那么酷":)实际上,没关系.我现在很沮丧:) (8认同)
  • 嗯,这是SQL中最有用的东西之一 - 在创建列时提供默认值.对'Django`来说太糟糕了:( (3认同)

Chr*_*att 9

唯一永久的解决方案是修补Django源代码,特别是db/backends/creation.py:

找:

if f.primary_key:
    field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
elif f.unique:
    field_output.append(style.SQL_KEYWORD('UNIQUE'))
Run Code Online (Sandbox Code Playgroud)

添加后:

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

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

或者(并且最好),如果您使用的是South,则可以db.create_table在迁移后执行一些额外的SQL :

MySQL的:

db.execute("ALTER TABLE yourapp_yourmodel MODIFY status int Default '4'")
Run Code Online (Sandbox Code Playgroud)

Postgres的:

db.execute("ALTER TABLE yourapp_yourmodel ALTER COLUMN status SET DEFAULT 4")
Run Code Online (Sandbox Code Playgroud)