Django 1.7空白CharField/TextField约定

Jer*_*ton 7 python django django-1.7 django-migrations

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

class TestModel(models.Model):
    field_1 = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)

我现在想要为模型添加一个新的TextField,所以它看起来像这样:

class TestModel(models.Model):
    field_1 = models.CharField(max_length=20)
    field_2 = models.TextField(blank=True)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用迁移此模型时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
Run Code Online (Sandbox Code Playgroud)

我可以通过添加null=True来轻松解决这个问题field_2,但Django的惯例是避免在CharField和TextField等基于字符串的字段上使用null(来自https://docs.djangoproject.com/en/dev/ref/models/fields/).这是一个错误,还是我误解了文档?

ch3*_*3ka 27

这不是一个错误,它是有记录和逻辑的.你添加一个新的字段,这是(通过最佳实践,你注意到)不能NULL这样django必须为现有记录添加一些东西 - 我想你想要它是空字符串.

您可以

 1) Provide a one-off default now (will be set on all existing rows)
Run Code Online (Sandbox Code Playgroud)

所以只需按1,并提供''(空字符串)作为值.

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

 2) Quit, and let me add a default in models.py
Run Code Online (Sandbox Code Playgroud)

  • 好吧,`显性比隐含更好.`blank = True`只告诉django admin接受空字符串作为输入,它并不意味着默认值.`default =`确实如此,指定一个与空字符串不同的默认值是完全合理的.对于`null = True`,迁移不使用`NULL`作为默认值,而只是没有 - 这恰好"评估"为"NULL". (2认同)