【问题标题】:Which Django model fields won't raise IntegrityError if no input is given?如果没有输入,哪些 Django 模型字段不会引发 IntegrityError?
【发布时间】:2019-07-09 15:00:01
【问题描述】:

我最初的想法是,如果对于任何字段null=False,那么如果程序没有为该字段指定值,则会因违反 NOT NULL 约束而引发 IntegrityError。我知道某些字段(例如 CharField)是一个例外,但我通过将 FileField 添加到模型中作为test = models.FileField() 进行了测试,并且没有给它任何输入。保存模型没有引发任何错误。

所以我的问题是,当没有指定值或默认值和null=False 时,哪些模型字段允许程序保存模型?我似乎在网上找不到任何完整的列表。

【问题讨论】:

  • 您在保存前是否致电model.full_clean()?
  • @WilliamBright 不,我没有。我不熟悉那个命令,在这种情况下它会做什么?
  • 它将在字段和模型中运行验证器,以检查它是否符合您希望数据“成形”的内容。意思是,如果你想要null = False,那么除非你调用full_clean,否则Django 不会真正验证它。这是过去时代的怪癖。
  • 是的,这对我有用,命令给出的消息说 FileField 不能为空,不能为空,即使 null=False。谢谢!

标签: python django django-models


【解决方案1】:

1 - 您不应将 null 与 blank 混淆

  • null 表示没有为该字段指定值。如果null=False 则必须为该字段指定一个值
    title = models.CharField(null = False)
    ......
    item = Item(.....)
    item.save() # won't save 
    item = Item(....., title='hello world')
    item.save() # will save
  • blank 表示该字段的值存在但为空。如果是blank=Flase,那么您必须至少提供一个非空值。
    title = models.CharField(blank= False)
    item = Item(.....)
    ......
    item.save() # won't save
    item = Item(....., title='')
    item.save() # won't  save
    item = Item(....., title='hello world')
    item.save() # will save

2 - FileField 和 ImageField 都作为字符串保存在数据库中,您可以添加 null=False 或 blank=False 使它们成为必需,就像使用 CharField 一样。

file = models.FileField(null=False, blank=False)

您甚至可以使用validators 添加更多约束,例如文件扩展名和文件大小。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2017-06-05
    • 2010-11-11
    相关资源
    最近更新 更多