【问题标题】:Django 1.7 blank CharField/TextField conventionDjango 1.7 空白 CharField/TextField 约定
【发布时间】: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/)。这是一个错误,还是我误解了文档?

【问题讨论】:

    标签: python django django-1.7 django-migrations


    【解决方案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. 选择1,会进入python终端。
    2. 给timezone.now(),它将从python终端退出。

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

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 2016-12-24
      • 2015-06-25
      • 1970-01-01
      • 2021-08-04
      • 2012-02-24
      相关资源
      最近更新 更多