在不指定默认值的情况下,不可能向 table_name 添加不可为 null 的字段“name”

问题描述 投票:0回答:3

我在现有模型中添加了以下字段:

name = models.CharField(max_length=128, unique=True)

但是应用迁移时出现以下提示:

 It is impossible to add a non-nullable field 'name' to table_name without specifying a default. This is because the database needs something to populate existing rows.
    Please select a fix:
     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit and manually define a default value in models.py.

我无法将其属性设置为blank=True、null=True,因为此字段是必须的。我无法设置它的默认值,因为该字段必须是唯一的。我还删除了该表中以前的所有数据。 如果我尝试在命令提示符中设置它的默认值,它会说请选择一个有效的选项。 怎么解决?

python django django-models django-rest-framework django-views
3个回答
3
投票

问题是您可能已有记录,但该字段是新的且唯一的。

这是我建议做的:

  1. 使用
    blank=True
    null=True
  2. 使用数据迁移或手动使用唯一名称填充现有记录。
  3. 在下次迁移中删除
    blank=True
    null=True

0
投票

在不指定默认值的情况下,不可能将不可为 null 的字段“name”添加到 table_name 中。这是因为数据库需要一些东西来填充现有的行。 请选择修复: 1) 现在提供一次性默认值(将在该列具有空值的所有现有行上设置) 2) 退出并在 models.py 中手动定义默认值。

解决方案: 选择选项 1) 立即提供一次性默认值(将在该列为空值的所有现有行上设置),然后转到您的模型并进行以下更改: 名称 = models.CharField(max_length=128, 空白=True) 注意*:您必须删除 name(unique = True),因为空白名称不会是唯一的,为了唯一性,请使用 id 作为主键


0
投票

注释引发错误的整个表并运行 makemigrations,这将从迁移中删除该表。然后,取消注释该表并重新运行 makemigrations,这将解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.