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