我可以在 Django 模型中将外键字段设为可选吗

Posted

技术标签:

【中文标题】我可以在 Django 模型中将外键字段设为可选吗【英文标题】:Can I make the foreign key field optional in Django model 【发布时间】:2011-09-30 23:45:26 【问题描述】:

我有这个代码

subject      = models.ForeignKey(subjects)
location     = models.ForeignKey(location)
publisher    =  models.ForeignKey(publisher)

我并不总是可能拥有三种价值的书籍。 所以有时如果我不知道主题、地点或出版商。然后我想让它们空着

但如果我有,那么我需要选择框来选择。有可能吗

【问题讨论】:

【参考方案1】:

当然,只需为您希望保留为可选字段的每个字段添加blank=True, null=True

subject = models.ForeignKey(subjects, blank=True, null=True)

【讨论】:

两者都需要吗?仅使用 null=True 有什么缺点? @WardC 两者的组合非常频繁,因为通常如果您要允许表单中的字段为空白,您还需要您的数据库允许 NULL 值那个领域。 CharFields 和 TextFields 是个例外,它们在 Django 中永远不会保存为 NULL。空白值作为空字符串 ('') 存储在数据库中。 @Ward,两者都不需要。只需使用null=True 就足够了。 blank=True 对于表单验证很重要。它将允许在此字段中输入一个空字符串作为用户输入。 null=True 将允许数据库列中的 NULL 值。 @cezar 评论救了我的命!谢谢【参考方案2】:

on_delete 参数是必要的,如果你这样做会更好。

subject = models.ForeignKey(subjects, on_delete=models.SET_NULL, blank=True, null=True)

【讨论】:

【参考方案3】:

null=True


subject=models.ForeignKey(subjects, on_delete=models.CASCADE, default=None, blank=True, null=True)

Field.null

如果为 True,Django 会将空值作为 NULL 存储在数据库中。默认为 False。

避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,这意味着它有两个可能的“无数据”值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的; Django 约定是使用空字符串,而不是 NULL。一个例外是当 CharField 同时设置了 unique=True 和 blank=True 时。在这种情况下,需要 null=True 以避免在保存具有空白值的多个对象时违反唯一约束。

【讨论】:

以上是关于我可以在 Django 模型中将外键字段设为可选吗的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pydantic 将每个字段设为可选

根据发货国家/地区将 Woocommerce 结帐电话字段设为可选

在 WooCommerce 中选择“本地取货”时,将结帐字段设为可选

Core Data codegen 如何决定是不是将属性设为可选?

Django 和 postgres - 在模型字段中将数据存储为 json 的缺点

Django:为可重用模型字段创建一个 Mixin