我有以下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
深入研究Django
的代码并使用Google搜索没有给我任何信息,但James Bennet的评论default
不会影响生成SQL
,但需要Django管理员。即便如此,我如何获得理想的效果?
我的Django
版本是1.3.0 final
答案 0 :(得分:14)
请注意,default
参数也可以使用可调用对象:https://docs.djangoproject.com/en/dev/ref/models/fields/#default。这当然是一种无法在SQL中复制的行为!因此,Django不可能为每种可能的情况生成SQL。看起来为了简单和一致,他们选择不为任何情况生成SQL。
答案 1 :(得分: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'))
添加后:
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)
或者(最好),如果您使用的是South,则可以在迁移中db.create_table
之后执行一些额外的SQL:
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")
答案 2 :(得分:0)
似乎django支持MySQL 8.0.13+中的默认参数。 Fixed #30712 -- Allowed BLOB/TEXT defaults on MySQL 8.0.13+.