【发布时间】: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