【问题标题】:Migration of Django app with south leaves default value on column使用南迁移 Django 应用程序在列上留下默认值
【发布时间】:2012-07-22 14:13:08
【问题描述】:

我在我的模型中添加了一个新字段来跟踪用户的各个对象。

然后我使用 south 生成了一个迁移,它要求我为此迁移提供一个默认值,因为用户字段没有默认值。我输入 1 作为用户的 ID。我使用 sqlite 作为数据库后端进行开发。现在,当我打开一个 sqlite shell 并查看 db 架构时,默认值仍然存在:

CREATE TABLE "base_category" ("user_id" integer NOT NULL DEFAULT 1,
                              "id" integer PRIMARY KEY,
                              "name" varchar(80) NOT NULL);

但是在迁移文件中它看起来像这样:

# Adding field 'TimeSlot.user'
db.add_column('base_timeslot', 'user',
                  self.gf('django.db.models.fields.related.ForeignKey')
                  (default=1, to=orm['auth.User']),
                  keep_default=False)

如果我正确理解了south docs,它不应该在那里:

如果 keep_default 为 True,则在该字段上指定的任何默认值都将永久添加到该列的数据库架构中。如果不是,则默认只在添加列时使用,然后删除。

在关于 SO 的其他问题中,有人指出,默认值不是在 db 级别上处理,而是在 python 中处理。

最后是我的问题:

  1. 因为我不再需要默认值,我是否需要担心数据库中的默认值?
  2. 这可能是 sqlite 的问题,因为我无法找到如何使用 SQL 提示手动删除默认值?

【问题讨论】:

  • 不,我不确定。但是,当我想手动更改该 sqlite 表上的默认值时,我产生了怀疑,但我没有找到明显的方法来实现它。

标签: django django-south


【解决方案1】:

这不是一个错误,但现在是; South 0.7.7(在我写这篇文章时即将发布)应该修复它。

【讨论】:

    【解决方案2】:
    1. 不用担心,DB中的DEFAULT 1只指定了如果你在表中创建一个新的实例,这个字段会默认填充1,但是这个值是可以改变的。 keep_default 所做的是禁止编辑该值,例如一个新字段将获得默认值 1 并且您无法更改该值。这不是你的情况。您将在新实例上获得默认值 1,但您将能够编辑该值。

    2. 连续点 num 1 - 无需删除该值,因为 DEFAULT 1 是字段新实例默认值的正确表示。

    【讨论】:

    • 您对keep_default 的描述显然是错误的; OP 的理解(错误应该意味着它在迁移结束时被删除)是正确的。
    猜你喜欢
    • 2012-04-17
    • 2011-11-08
    • 2011-07-31
    • 2015-03-07
    • 2014-10-25
    • 2017-02-14
    • 1970-01-01
    • 2017-07-11
    • 2010-10-27
    相关资源
    最近更新 更多