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.
唯一永久的解决方案是修补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)
| 归档时间: |
|
| 查看次数: |
7744 次 |
| 最近记录: |