我可以在 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 模型中将外键字段设为可选吗的主要内容,如果未能解决你的问题,请参考以下文章
根据发货国家/地区将 Woocommerce 结帐电话字段设为可选
在 WooCommerce 中选择“本地取货”时,将结帐字段设为可选
Core Data codegen 如何决定是不是将属性设为可选?