空白值的 Django 模型验证
Django model validation on blank values
如果您使用 blank=True
定义字段,则验证会正确地允许空白值,如果 blank=False
则空白值会引发验证异常。通常它很简单,但是使用 JSONField
可以有 3 个不同的空白值之一,它们是:''
、[]
、{}
。本质上,我只想允许 {}
作为唯一可接受的空白值。但是,空白值永远不会传递给自定义字段验证器,因此似乎无法通过标准方式实现。
def validate_dict(value):
if not isinstance(value, dict):
raise ValidationError(
'"%(value)s" is not valid JSON',
params={'value': value},
)
class MyModel(models.Model):
json = JSONField(default=dict, blank=True, validators=[validate_dict])
在上面的示例中,所有 "blank" 值立即被视为有效,并且永远不会调用 validate_dict
。如果我将 blank=True
更改为 blank=False
然后所有空白值立即被视为无效并且 validate_dict
永远不会被调用。
我想验证存储的数据始终是 dict
,但似乎无法验证空值是否仅是 dict
。
我发现 这表明我可以通过执行以下操作来解决此问题:
def validate_dict(value):
if not isinstance(value, dict):
raise ValidationError(
'"%(value)s" is not valid JSON',
params={'value': value},
)
class DictJSONField(JSONField):
empty_values = [{}]
default_validators = [validate_dict]
class MyModel(models.Model):
json = DictJSONField(default=dict, blank=True)
似乎总是在 SO 中设计问题后立即找到答案。 (虽然我还没有测试过)
如果您使用 blank=True
定义字段,则验证会正确地允许空白值,如果 blank=False
则空白值会引发验证异常。通常它很简单,但是使用 JSONField
可以有 3 个不同的空白值之一,它们是:''
、[]
、{}
。本质上,我只想允许 {}
作为唯一可接受的空白值。但是,空白值永远不会传递给自定义字段验证器,因此似乎无法通过标准方式实现。
def validate_dict(value):
if not isinstance(value, dict):
raise ValidationError(
'"%(value)s" is not valid JSON',
params={'value': value},
)
class MyModel(models.Model):
json = JSONField(default=dict, blank=True, validators=[validate_dict])
在上面的示例中,所有 "blank" 值立即被视为有效,并且永远不会调用 validate_dict
。如果我将 blank=True
更改为 blank=False
然后所有空白值立即被视为无效并且 validate_dict
永远不会被调用。
我想验证存储的数据始终是 dict
,但似乎无法验证空值是否仅是 dict
。
我发现
def validate_dict(value):
if not isinstance(value, dict):
raise ValidationError(
'"%(value)s" is not valid JSON',
params={'value': value},
)
class DictJSONField(JSONField):
empty_values = [{}]
default_validators = [validate_dict]
class MyModel(models.Model):
json = DictJSONField(default=dict, blank=True)
似乎总是在 SO 中设计问题后立即找到答案。 (虽然我还没有测试过)