Валидация типов в JSONField в Django

Заявление о проблеме

У меня есть модель Django, содержащая JSONField среди других полей:

class MetaData(models.Model):
     main = models.ForeignKey()
     name = models.CharField()
     dict_field = models.JSONField()

Где dict_field - это "свалка данных" для всех оставшихся метаданных, которые я не хочу включать в качестве отдельного поля.

Хотя это "дамп" данных, я все же хочу, чтобы он имел базовую проверку типов. Как я могу проверить входы этого JSONField так, чтобы оно принимало только предопределенный список ключей и связанных с ними типов, как показано ниже:

"key1": bool
"key2": int
"key3": Optional[int]

Есть ли в django встроенная функциональность для решения такого рода проблем? Если нет, то какие другие решения вы можете порекомендовать? (pydantic и т.д.)

Вы можете написать валидатор для этого:

from django.core.exceptions import ValidationError
from django.utils.deconstruct import deconstructible


@deconstructible
class BasicJsonValidator:
    def __init__(self, types):
        self.types = types

    def __call__(self, mydict):
        if not isintance(mydict, dict):
            raise ValidationError('Value must be a dictionary.')
        for key, value in mydict.items():
            if key not in self.types:
                raise ValidationError(f'key {key} should not be present')
            if not isinstance(value, self.types[key]):
                raise ValidationError(
                    f'for {key}, {value} should be a {self.types[key]}'
                )

Тогда вы можете использовать валидатор с:

class MetaData(models.Model):
    main = models.ForeignKey()
    name = models.CharField()
    dict_field = models.JSONField(
        validators=[
            BasicJsonValidator({'key1': bool, 'key2': int, 'key3': Optional[int]})
        ]
    )
Вернуться на верх