【问题标题】:Disallow empty string as a valid value on a model with choices that include NULL不允许空字符串作为模型上的有效值,其选项包括 NULL
【发布时间】:2023-03-22 22:15:01
【问题描述】:

我有以下型号:

class MyModel(models.Model):
    RED = 'red'
    BLUE = 'blue'
    EMPTY_COLOR = None
    COLORS  = (
        (EMPTY_COLOR, '---'),
        (RED, 'red'),
        (BLUE, 'blue'),
    )

    color = models.CharField(max_length=255, null=True, blank=True,
                             choices=COLORS, default=EMPTY_COLOR)

如果颜色设置为None(当然是蓝色/红色),但当它设置为空字符串时,我希望模型验证为有效(在实例上使用full_clean())。然而,空字符串很高兴允许在模型上定义并保存在数据库中,即使在我看来,选择被定义为只能是 NULL、“red”或“blue”。

我的假设不正确吗?当颜色为None 时,如何在保持模型验证正常工作的同时禁止空字符串成为有效值?

【问题讨论】:

  • 您不能在数据库级别强制执行此操作,但是您可以在模型上编写自己的 clean_color() 方法来显式检查空字符串值并引发 ValidationError 如果是这种情况.这将确保在您验证模型时(例如通过ModelForm),这将被捕获。您还可以在保存时进行最终检查(覆盖save() 方法)以确保没有代码保存空字符串(绕过验证)。
  • 奇怪,我想我理解为什么这不是在数据库级别强制执行的,但我假设如果您定义一组选项以包含三个值,它也不应该接受一个值不包括在该集合中。
  • 但是你设置了blank=True,这正是 Django 解释的意思是允许空字符串。
  • 您所做的有点违反 Django 约定:“避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,则意味着它具有“无数据”的两个可能值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能值是多余的; Django 约定是使用空字符串,而不是 NULL。"
  • @dirkgroten 感谢您的参考!我想我会修改我的字段以使用EMPTY_COLOR = '' 而不是EMPTY_COLOR = None。如果需要,您可以将其作为答案提交。

标签: python django django-models django-validation


【解决方案1】:

尝试删除颜色字段上的空白=True

color = models.CharField(max_length=255, null=True,
                             choices=COLORS, default=EMPTY_COLOR)

或将其设置为空白=假

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2022-11-12
    • 2015-10-04
    • 2020-09-27
    • 1970-01-01
    • 2011-07-29
    • 2014-06-21
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多