django postgresql json字段模式验证

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)

  • 如果这是内置的,那就太好了。:-) (3认同)
  • 这是一个很好的解决方案,但在验证失败时会导致500错误.相反,它可以捕获由json模式引起的验证错误,并引发django验证器的验证错误. (2认同)
  • 避免使用500错误:`def compare(self,a,b):try:validate(a,b)除了:raise ValidationError(_('%(value)s不是schema'),params = {'value ':a},)` (2认同)

C14*_*14L 7

这就是该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)


udo*_*udo 7

您可以使用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