Если вы определяете поле с помощью 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])
В приведенном выше примере все «пустые» значения сразу же считаются действительными и validate_dict
никогда не называется. Если я изменю blank=True
на blank=False
, то все пустые значения немедленно будут считаться недействительными, и снова validate_dict
никогда не будет вызываться.
Я хотел бы проверить, что сохраненные данные всегда dict
, но кажется невозможным проверить, что пустое значение является только dict
.