Django模型:列的默认值

20

我有以下的 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 的代码并且进行了搜索,但是没有发现有用的信息。但是 James Bennet 的评论提到default 不会被认为影响生成 SQL,但在 Django admin 中需要。即使如此,我该如何获得期望的效果呢?

我使用的 Django 版本是 1.3.0 final。


default 可以被赋值为可调用对象的事实表明它主要在模型实例创建期间使用。除了手动运行 SQL ALTER 命令外,据我所知,无法做到你想要的。 - Shawn Chin
谢谢,肖恩。我预料到这个答案,因为我的谷歌搜索没有结果。 - Nemoden
3
相关工单:https://code.djangoproject.com/ticket/470 - user
3个回答

13

3
这是SQL中最实用的功能之一——在创建列时提供默认值。对于Django来说真是太遗憾了 :( - Nemoden
@Nemoden,你总是可以手动更改你的SQL。Django添加了这个功能以使其更加灵活。就像Django和Python中的许多其他功能一样,如果你不喜欢它,你可以自己修改! - NickAldwin
9
当然,是的...但是...我只是感到失望。从盒子里提供它并不难,对吧? :) 如果不可调用将默认值添加到创建列语句中...这真的很令人困惑,因为作为Django新手,你会认为“好的,很好...我们在这里有一个默认选项,所以让我们提供一些默认值”,但它什么也不做...一开始你还以为“哇,Django模型太酷了”,现在你觉得“呜啦啦...它们并不那么酷”:)没关系,其实我只是有点沮丧 :) - Nemoden

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,则最好的方法是在迁移后执行一些额外的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")


没错!不仅我对此感到沮丧 :) 谢谢你提供的解决方案。但我不能接受它,因为这是一个非常肮脏的hack。所以现在我会使用 alter table mytable modify column status bool not null default TRUE - Nemoden
1
嗯...我在答案中已经说得很清楚了,并建议您找到其他方法,例如使用South自动添加列,因为补丁源不是一个好主意。这似乎正是您计划通过South或手动方式来实现的。 - Chris Pratt
我很困惑...有人提交了一个 Django 的补丁吗? - mlissner

0

当您为“NOT NULL”字段创建迁移时,它会提示您提供“默认值”以填充现有字段。这似乎是通过在列上临时添加“DEFAULT”值,然后在迁移的一部分中将其删除来实现的。我想这就是这样的。 - Tim Tisdall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接