Django 1.7 空 CharField/TextField 约定
使用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
- 输入 select 1,系统会跳转到 Python 终端。
- 输入 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