【问题标题】:Schemamigration: adding a simple Null fieldSchemamigration:添加一个简单的 Null 字段
【发布时间】:2014-06-05 18:17:15
【问题描述】:

好的,所以我有一个名为 locationmanager 的应用程序,其模型如下所示:

class Location(models.Model):
    region = models.ForeignKey(Region)

我想把它改成这个

class Location(models.Model):
    region = models.ForeignKey(Region, blank=True, null=True)

所以我运行了架构迁移并收到以下信息:

$ python manage.py schemamigration locationmanager --auto
 ? The field 'Location.region' does not have a default specified, yet is NOT NULL.
 ? Since you are making this field nullable, you MUST specify a default
 ? value to use for existing rows. Would you like to:
 ?  1. Quit now.
 ?  2. Specify a one-off value to use for existing columns now
 ?  3. Disable the backwards migration by raising an exception; you can edit the migration to fix it later
 ? Please select a choice: 

这让我很困惑。是的,我已经阅读了南方的文档。

  1. 首先,为什么它说'Location.region' does not have a default specified, yet is NOT NULL. 我对该字段所做的更改使其成为空值,这是什么情况?一个解释会很棒。

  2. 为什么需要指定默认值?一旦我指定了这个默认值,它在哪里?在 SQL 表中?如果我有现有数据,这是否重要,或者这仅仅是为了方案本身?

3.我有点理解选项 1,2,但选项 3 究竟会做什么?为什么有用?

非常感谢。

【问题讨论】:

    标签: python django django-models django-south


    【解决方案1】:

    因为迁移是双向的。有一天,您可能想要回滚到之前的状态,在这种情况下,您需要为必填字段设置一个默认值。

    哦,在这种情况下,我通常总是选择选项 2 并输入 0 作为值。工作正常。

    【讨论】:

    • 我明白了,但是如何为外键添加0?这不是没有多大意义吗?
    • 它没有,但我这样做是因为 ForeignKey 可以传递一个数字,0 很少是现有模型的pk。如果您认为不会回滚,请选择选项3。
    猜你喜欢
    • 2014-11-02
    • 2017-12-23
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多