空白值的 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 中设计问题后立即找到答案。 (虽然我还没有测试过)