Django 1.7 空白 CharField/TextField 约定

Posted

技术标签:

【中文标题】Django 1.7 空白 CharField/TextField 约定【英文标题】:Django 1.7 blank CharField/TextField convention 【发布时间】:2014-12-30 09:29:17 【问题描述】:

使用 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

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

【问题讨论】:

【参考方案1】:

这不是错误,它已记录在案且符合逻辑。 您添加了一个新字段,该字段(根据最佳实践,正如您所注意到的)不是 NULLable,因此 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

【讨论】:

我想这是有道理的,但它让我觉得奇怪的行为。我希望如果我指定blank=True,迁移将自动使用空白字符串作为默认值,就像我指定null=True,我不需要告诉迁移使用NULL 作为默认值. 好吧,explicit is better than implicitblank=True 只告诉 django 管理员接受空字符串作为输入,并不意味着默认值。 default= 确实如此,并且指定一个不同于空字符串的默认值是完全合理的。对于null=True,迁移不使用NULL 作为默认值,而只是什么都不使用- 恰好“评估”到NULL【参考方案2】:
    选择1,会进入python终端。 给timezone.now(),它将从python终端退出。

注意:第一次可能不会从终端退出,请再次给出该命令。

【讨论】:

以上是关于Django 1.7 空白 CharField/TextField 约定的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7 中的 Django-migrations 检测模型更改,但不会在迁移时应用它们

在迁移中获取模型 ContentType - Django 1.7

Django 1.7 迁移

无法将 Django 从 1.7 迁移到 1.8

python 将Django QuerySet作为JSON响应返回的示例(Django 1.7)

Django 1.7 - 提供静态文件