Mr *_* T. 11 django postgresql json jsonschema
我有一个django模型与JSONField(django.contrib.postgres.fields.JSONField)有什么办法可以验证模型数据对json模式文件?
(预先保存)
类似的东西my_field = JSONField(schema_file=my_schema_file)
小智 8
为了做到这一点,我使用jsonschema编写了一个自定义验证器(Django 1.11,Python 3.6).
jsonschema
import django
from django.core.validators import BaseValidator
import jsonschema
class JSONSchemaValidator(BaseValidator):
def compare(self, a, b):
try:
jsonschema.validate(a, b)
except jsonschema.exceptions.ValidationError:
raise django.core.exceptions.ValidationError(
'%(value)s failed JSON schema check', params={'value': a})
Run Code Online (Sandbox Code Playgroud)
project/validators.py
from django.db import models
from django.contrib.postgres.fields import JSONField
from project.validators import JSONSchemaValidator
MY_JSON_FIELD_SCHEMA = {
'schema': 'http://json-schema.org/draft-07/schema#',
'type': 'object',
'properties': {
'my_key': {
'type': 'string'
}
},
'required': ['my_key']
}
class MyModel(models.Model):
my_json_field = JSONField(
default=dict,
validators=[JSONSchemaValidator(limit_value=MY_JSON_FIELD_SCHEMA)]
)
Run Code Online (Sandbox Code Playgroud)
这就是该Model.clean()方法的用途(请参阅文档)。例子:
class MyData(models.Model):
some_json = JSONField()
...
def clean(self):
if not is_my_schema(self.some_json):
raise ValidationError('Invalid schema.')
Run Code Online (Sandbox Code Playgroud)
您可以使用cerberus根据架构验证您的数据
from cerberus import Validator
schema = {'name': {'type': 'string'}}
v = Validator(schema)
data = {'name': 'john doe'}
v.validate(data) # returns "True" (if passed)
v.errors # this would return the error dict (or on empty dict in case of no errors)
Run Code Online (Sandbox Code Playgroud)
它使用起来非常简单(也因为它有很好的文档 -> 验证规则:http : //docs.python-cerberus.org/en/stable/validation-rules.html)