【问题标题】:How to set the default value for existing entries when adding a new column?添加新列时如何设置现有条目的默认值?
【发布时间】:2015-05-26 10:37:38
【问题描述】:

我的 Django 应用中有一个模型,需要添加一个新的 BooleanFieldcolumn。此列不应为空 - 相反,我希望所有现有条目将此字段设置为 False

我该怎么做?如果我只是添加新字段并设置default = False,则会导致OperationalError: no such column 错误。

【问题讨论】:

  • 我相信manage.py migrate会处理这种情况并为您设置默认值,您尝试过吗?

标签: django django-1.7


【解决方案1】:

您需要使用Django's migrations,这将允许您将字段添加到数据库中。

简而言之,您对模型进行更改,使用manage.py makemigrations 创建迁移,然后使用manage.py migrate 运行它。

【讨论】:

  • 如果我先删除所有现有行,这确实有效。但是,当我在表中有现有行时,它不起作用。它会导致我提到的错误。
  • 什么时候出现这个错误?当你运行makemigrationsmigrate
  • 在运行这些并尝试访问 Django 管理面板中的表之后。 makemigrations 在我添加新字段时说“未检测到更改”。
【解决方案2】:

听起来您需要在添加新列后迁移数据库。就像您在第一次创建数据库时使用 syncdb 命令执行“create table”命令一样,迁移会将“alter table”更改写入数据库。

https://docs.djangoproject.com/en/1.8/topics/migrations/

【讨论】:

  • 我确实像往常一样运行了迁移命令,但现有行不受影响。我知道如何解决这个问题的唯一方法是删除所有现有的行,这并不理想。
  • 您是否对应用进行了初始迁移?
【解决方案3】:

原来我错过了迁移命令需要应用程序名称。所以,我不得不像这样运行命令:

manage.py makemigrations app_name

【讨论】:

  • 只有在还没有任何迁移的情况下才需要应用名称。这是为了防止在应用不需要迁移时意外生成迁移。
【解决方案4】:

默认BooleanField 列为False,您无需指定任何内容。只需运行python manage.py migrate。它应该可以工作。

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多