对如何使 Django 模型字段可选的感到困惑
Posted
技术标签:
【中文标题】对如何使 Django 模型字段可选的感到困惑【英文标题】:Confused about how to make Django model field optional 【发布时间】:2017-04-21 13:22:12 【问题描述】:我的 Django 模型中有一个“地址”字段,我希望它是可选的:
class Home(models.Model):
address = models.CharField(max_length=256, blank=True, default=None)
city = models.CharField(max_length=25)
我希望这是我数据库中的可选字段,但我没有设置“null=True”,因为documentation 说
"避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null,因为空字符串值将始终存储为空字符串,而不是 NULL。如果基于字符串的字段具有 null=True,则意味着它有两种可能“无数据”的值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的; Django 的约定是使用空字符串,而不是 NULL。”
但是,当我使用此命令创建 Home 对象时:
Home.objects.create(city='Chicago')
我收到一个错误:
IntegrityError: null value in column 'address' violates not-null constraint.
我不应该在地址字段中添加“null=True”,尽管文档说了什么以使其成为可选吗?如果不是,应该如何声明它以便我可以创建新的 Home 对象而不会引发此错误?
【问题讨论】:
您想设置“默认”值吗? docs.djangoproject.com/en/1.10/ref/models/fields/#default 另请参阅此问题的答案。 ***.com/questions/755857/… 我做到了。它设置为“无”。我错过了什么吗? 省略default
,默认值为空字符串。
'None' 显然是一个 NULL 约束。只需将空字符串分配给默认值。我不同意凯文。
【参考方案1】:
如果你不总是添加你需要添加的地址
null= True
因为默认设置为无,但数据库未设置为接受空值
【讨论】:
我不明白为什么文档说它没有解决这个问题,所以我只是像往常一样设置“null=True”。【参考方案2】:你应该去掉default=None
,否则,你可以使用default=''
【讨论】:
我认为这是最好的方法,因为它与Django如何表示空的CharFields是一致的。 当我进行此更改并检查我的 PostgreSQL 数据库表架构时,它仍然说地址字段是“非空”。 您是否运行了“manage.py makemigrations”和“manage.py migrate”? 好的,但是这个新问题是一个错误,还是只是说该字段不为空? 在做\d时,数据库架构只是说地址字段是“not null”,这不是数据库错误。以上是关于对如何使 Django 模型字段可选的感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
如何使 django 中的 FileField 成为可选的?
如何使 django 中的 FileField 成为可选的?
如何模仿 django admin 的 OneToOneField 可选表单