对如何使 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 模型字段可选的感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对 swift 中的可选值感到困惑

如何使 django 中的 FileField 成为可选的?

如何使 django 中的 FileField 成为可选的?

如何模仿 django admin 的 OneToOneField 可选表单

在 Django 的身份验证用户模型中,将名字、姓氏作为必需属性而不是可选属性

django模型的字段中字符串参数的含义是啥?