Django模型:列的默认值

时间:2011-05-27 14:13:01

标签: mysql django django-models

我有以下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

3 个答案:

答案 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+.