ChatGPT解决这个技术问题 Extra ChatGPT

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

我有这个代码

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

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

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


a
akki

当然,只需为您希望保持可选的每个字段添加 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 值。
如果您最初没有 blank=True, null=True 但现在应用了迁移,是否还需要其他东西?我有这种情况,虽然架构看起来不错,但管理表单不允许空白。其他允许空白的 FK 最初可以工作,但我看不出有什么区别。
M
Muhammad Zubair

为了实现这一点,on_delete 参数与 blank=Truenull=True 一起是必需的,如果您这样做会更好。

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

M
MD SHAYON

null=True

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

字段.null

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

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