2016-06-05 3 views
1

Ich habe ein Django-Modell mit einem JSONField (django.contrib.postgres.fields.JSONField) Gibt es eine Möglichkeit, dass ich Modelldaten gegen eine JSON-Schema-Datei validieren kann? (Pre-save)
So etwas wie my_field = JSONField(schema_file=my_schema_file)django postgresql JSON-Feld Schema-Validierung

+0

Die kurze Antwort ist nein, jedoch ist es möglich, die Validierung zu erzwingen, indem Sie die Modus-Save-Methode überschreiben. – e4c5

Antwort

2

Das ist, was die Model.clean() Methode für (see docs) ist. Beispiel:

class MyData(models.Model): 
    some_json = JSONField() 
    ... 

    def clean(self): 
     if not is_my_schema(self.some_json): 
      raise ValidationError('Invalid schema.') 
0

Ich schrieb einen benutzerdefinierten Validator jsonschema, um mit diesem zu tun (Django 1.11, Python 3.6).

# project/validators.py 
from jsonschema import validate 
from django.core.validators import BaseValidator 

class JSONSchemaValidator(BaseValidator): 
    def compare(self, a, b): 
     return validate(a, b) 

# project/app/models.py 
from django.db import models 
from django.contrib.postgres.fields import JSONField 
from project.validators import JSONSchemaValidator 

MY_JSON_FIELD_SCHEMA = { 
    'type': 'object', 
    'schema': 'http://json-schema.org/draft-07/schema#', 
    '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)] 
    )