Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不允许空字符串作为包含NULL选项的模型上的有效值_Python_Django_Django Models_Django Validation - Fatal编程技术网

Python 不允许空字符串作为包含NULL选项的模型上的有效值

Python 不允许空字符串作为包含NULL选项的模型上的有效值,python,django,django-models,django-validation,Python,Django,Django Models,Django Validation,我有以下型号: 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, b

我有以下型号:

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\u clean()
)。但是,允许在模型上定义空字符串,并将其保存在数据库中,即使在我看来,选项定义为仅为NULL、“红色”或“蓝色”


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

请尝试删除颜色字段中的blank=True

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

或者将其设置为blank=False

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