Django проверка модели на пустых значениях - PullRequest
2 голосов
/ 28 февраля 2020

Если вы определяете поле с помощью 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.

1 Ответ

1 голос
/ 28 февраля 2020

Я нашел { ссылка }, который показывает, что я могу обойти проблему, выполнив следующее:

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)

Всегда кажется, что вы найдете ответ сразу после изготовления вопрос в СО. (хотя я еще не проверял это)

...