使用南方迁移Django app会在列上留下默认值

时间:2012-07-22 14:13:09

标签: django django-south

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

然后我使用south生成了一个迁移,并且它要求我提供此迁移的默认值,因为用户字段没有默认值。我输入1作为用户的id。我使用sqlite作为db后端进行开发。现在,当我打开一个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提示手动删除默认值?

2 个答案:

答案 0 :(得分:2)

这不是一个错误,但现在是;南0.7.7(我写这篇文章即将出版)应该解决它。

答案 1 :(得分:0)

  1. 请不要担心,数据库中的DEFAULT 1仅指定如果在表中创建新实例,则默认情况下此字段将填充1,但此值可以更改。 keep_default执行的操作是禁用正在编辑的值,例如默认情况下,新字段将获得值1,您无法更改该值。这不是你的情况。您将在新实例上获得默认值1,但您可以编辑该值。

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