【问题标题】:Django models: default value for columnDjango模型:列的默认值
【发布时间】:2011-09-03 10:52:46
【问题描述】:

我有以下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 的代码和谷歌搜索什么也没给我,但詹姆斯班纳特的评论认为default 不会影响生成SQL,但Django 管理员需要。即使是这样,我怎样才能得到想要的效果?

我的Django 版本是 1.3.0 最终版

【问题讨论】:

  • default 也可以分配可调用对象这一事实表明它主要在模型实例创建期间使用。除了手动运行SQL ALTER 命令之外,AFAIK 不可能做你想做的事。
  • 谢谢,肖恩。我期待这个答案,因为我的谷歌搜索没有结果。

标签: mysql django django-models


【解决方案1】:

请注意,default 参数也可以采用可调用对象:https://docs.djangoproject.com/en/dev/ref/models/fields/#default。那肯定是不能在 SQL 中重现的行为!因此 Django 不可能为每种可能的情况生成 SQL。看起来为了简单和一致,他们选择在任何情况下都不生成 SQL。

【讨论】:

  • 嗯,这是 SQL 中最有用的事情之一 - 在创建列时提供默认值。 Django 太糟糕了:(
  • @Nmoden 您可以随时手动更改您的 SQL。 Django 添加了这个以使其更加灵活。与 Django 和 Python 中的许多东西一样,如果你不喜欢它,你可以改变它!
  • 当然,是的......但是......我只是很失望。开箱即用并不难,对吧? :) If !callable add default value into create column statement... 这真的很令人困惑,因为Django 菜鸟你认为Ok, good... We have a default option here, so let's provide some default value 它什么也没做... 首先你认为“哇,Django 模型太酷了”,现在你们所有人“哇……他们没那么酷” :) 没关系,实际上。我现在只是不高兴:)
【解决方案2】:

唯一永久的解决方案是修补 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")

【讨论】:

  • 没错!不仅我对此感到不安:)谢谢您的解决方案。我不能接受它,因为它是一个肮脏的肮脏的黑客。所以现在我会选择alter table mytable modify column status bool not null default TRUE
  • Ummm...我在答案中说了很多,并且还建议您找到另一种方法,例如使用 South 自动添加列,因为修补源不是一个好主意。这似乎正是您打算通过 South 或手动执行的操作。
  • 我很困惑……有人向 Django 提交了补丁吗?
【解决方案3】:

django 似乎已经支持 MySQL 8.0.13+ 中的默认参数。 Fixed #30712 -- Allowed BLOB/TEXT defaults on MySQL 8.0.13+.

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2021-04-03
    • 2017-11-10
    相关资源
    最近更新 更多