This package provides a mixin class that extends a MongoEngine document's functionality by adding a .json_schema() method and allows generating a JSON schema directly from the document. Generated schema then can be used in API documentation or form validation and automatic form generation on a web application frontend, etc.
Generated schema should be compatible with JSON schema specification version Draft-7 and newer.
Tested on
- Python 3.10
- MongoEngine 0.27.0
but should work on Python >= 3.7 and MongoEngine >= 0.20.0 without any problems.
pip install mongoengine-jsonschemaAdd JsonSchemaMixin to your document class as parent. Resolution order matters, so always place MongoEngine document first.
import mongoengine as me
from mongoengine_jsonschema import JsonSchemaMixin
class Person(me.Document, JsonSchemaMixin):
name = me.StringField(required=True, min_length=1, max_length=32)
age = me.IntField(min_value=0)Then you can generate JSON schema by calling .json_schema() method.
Person.json_schema()which returns the schema as a Python dictionary
{
'$id': '/schemas/Person',
'title': 'Person',
'type': 'object',
'properties': {
'age': {
'type': 'integer',
'title': 'Age',
'minimum': 0
},
'name': {
'type': 'string',
'title': 'Name',
'minLength': 1,
'maxLength': 32
}
},
'required': ['name'],
'additionalProperties': False
}Check out example.md for a more extensive example.
- Inheritance is supported. Make sure you add mixin to parent class.
additionalPropertiesis set toFalseforDynamicDocumentandDynamicEmbeddedDocumentclasses.requiredkeyword can be removed by settingstrictargument toFalse(.json_schema(strict=False)). This is useful for partial validation when updating documents using HTTP PATCH method.- Constraints for special
StringFieldtypes such asEmailField,URLField,UUIDField,DateTimeFieldetc. are applied to schema usingformatand/orpatternkeywords. - Fields derived from
GeoJsonBaseFieldcan be validated for both array and object types as supported by MongoEngine. - Field arguments/constraints
required,min_length,max_length,min_value,max_value,default,choices,regexandurl_regex(forURLField) are supported and reflected to schema. - Excluding a field from schema is possible with setting field argument
exclude_from_schematoTrue. Example:name = me.StringField(exclude_from_schema=True)
- Auto-generates human-friendly (first-letter capitalized, separate words)
titlefrom both document (PascalCase) and field names (snake_case). Keeps uppercase acronyms as is, e.g.page_URL->Page URL. - For
ListFieldtypes,required=Truemeans it cannot be empty, therefore, schema defines this constraint withminItemskeyword. - Custom schemas can be defined directly in model class with
_JSONSCHEMAclass attribute. Setting a_JSONSCHEMAattribute will bypass JSON schema generation.
FileField,ImageFieldfields are not supportedPolygonFieldandMultiPolygonFieldmust start and end at the same point, but this is not enforced by generated schemaschemesargument is ignored forURLFielddomain_whitelist,allow_utf8_user,allow_ip_domainarguments are ignored forEmailField- The following fields are defined in schema as strings and may require field specific conversion before assigning to a document's attribute:
ObjectIdFieldBinaryFieldDateTimeFieldComplexDateTimeFieldDateFieldReferenceFieldLazyReferenceFieldCachedReferenceFieldGenericReferenceFieldGenericLazyReferenceField
- Email: [email protected]
- GitHub: symphonicityy
- Project Link: (https://github.com/symphonicityy/mongoengine-jsonschema)
Contributions, issues, and feature requests are welcome!