模型字段设为可选

编辑表单要求填写每个字段,而有时候某些字段需要是可选的。比如说,我们可能想让 Author 模型的 email 字段可选,即允许使用空字符串。事实也是如此,你
不可能有每位作者的电子邮件地址。

解决:email 字段添加 blank=True 参数即可
          email = models.EmailField(blank=True)

默认情况下,所有字段都设定了 blank=False,意即不允许为空值

把日期和数值字段设为可选的:
为日期和数值字段设定 blank=True 时经常遇到问题,这背后涉及很多知识。SQL 使用是一个特殊的值表示空
——NULL。它的意思是未知无效,或者其他情境中的特定意思。在 SQL 中,NULL 与空字符串不是一
回事,就像 Python 对象 None 不是空字符串("")一样。
因此,特定的字符字段(如 VARCHAR 列)的值既可以是 NULL,也可以是空字符串。这可能导致意料之外的歧
义:为什么在这个记录中是 NULL,而在其他记录中是空字符串?二者有区别吗,还是说输入的数据不一
致?以及:如何获取所有为空值的记录,应该包含值为 NULL 和空字符的记录,还是只选择值为空字符串的
记录?
为了避免这种歧义,Django 自动生成的 CREATE TABLE 语句中每个列定义都有 NOT NULL

 多数情况下,这种默认行为对应用程序来说是最佳选择,无需费力处理数据不一致。而且,Django 的其他部
分能很好地支持这个行为,例如 Django 管理后台,当你留空字符字段时,Django 插入数据库的是空字符串
(而不是 NULL 值)。
但是,对空字符串不是有效值的数据库列类型(如日期、时间和数字)来说,这样处理不行。如果把空字符
串插入日期或整数列,数据库有可能报错——这取决于你用的数据库。(PostgreSQL 严格,遇到这种情况时
抛出异常;MySQL 可能允许这么做,也可能不允许,根据版本、时间和月相而定。)
此时,只能使用 NULL 指定空值。在 Django 模型中,指定接受 NULL 值的方式是为字段设定 null=True 参数。
因此,说起来有点复杂:如果想让日期字段(如 DateFieldTimeFieldDateTimeField)或数值字段(如
IntegerFieldDecimalFieldFloatField)接受空值,要同时添加 null=True blank=True

publication_date = models.DateField(blank=True, null=True)


添加 null=True 比添加 blank=True 复杂,因为前者修改了数据库的语义,即修改了 CREATE TABLE 语句,把
publication_date 字段的 NOT NULL 删掉了。为了完成修改,我们要更新数据库。基于一些原因,Django 不会
试图自动修改数据库模式,所以每次对模型做这种修改之后要自己动手执行 python manage.py migrate


原文地址:https://www.cnblogs.com/yu121/p/14963079.html