Django 1.7 空 CharField/TextField 约定

16 投票
2 回答
35494 浏览
提问于 2025-05-01 08:44

使用Django的新迁移框架,假设我在数据库中已经有了以下模型:

class TestModel(models.Model):
    field_1 = models.CharField(max_length=20)

现在我想给这个模型添加一个新的文本字段(TextField),让它变成这样:

class TestModel(models.Model):
    field_1 = models.CharField(max_length=20)
    field_2 = models.TextField(blank=True)

当我尝试使用 python manage.py makemigrations 来迁移这个模型时,我收到了这个提示:

You are trying to add a non-nullable field 'field_2' to testmodel without a default; we can't do that (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)
 2) Quit, and let me add a default in models.py

我可以通过给 field_2 添加 null=True 来轻松解决这个问题,但Django的惯例是尽量避免在像CharField和TextField这样的字符串字段上使用null(详细信息可以参考这里)。这算是个bug,还是我对文档理解错了?

暂无标签

2 个回答

2
  1. 输入 select 1,系统会跳转到 Python 终端。
  2. 输入 timezone.now(),系统会退出 Python 终端。

注意:第一次输入可能不会退出终端,再输入一次那个命令就可以了。

44

这不是个错误,这是有说明的,而且是合乎逻辑的。你添加了一个新字段,按照最佳实践,这个字段不能是 NULL,所以Django必须为已有的记录填入一些东西——我想你希望它填的是空字符串。

你可以这样做:

 1) Provide a one-off default now (will be set on all existing rows)

所以只需按1,然后提供 ''(空字符串)作为值。

或者在models.py中指定 default='',就像建议的那样:

 2) Quit, and let me add a default in models.py

撰写回答