Валидация типов в 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]})
]
)