diff --git a/docs/blueprints.rst b/docs/blueprints.rst index e6d61fb7..0a48c12c 100644 --- a/docs/blueprints.rst +++ b/docs/blueprints.rst @@ -155,4 +155,10 @@ Pydantic Preliminary support for `Pydantic `_ models. This may or may not end up in the main package. Catches decorated Pydantic classes and integrates their schema. -.. literalinclude:: blueprints/pydantic.py \ No newline at end of file +Pydantic 1: + +.. literalinclude:: blueprints/pydantic.py + +Pydantic 2: + +.. literalinclude:: blueprints/pydantic2.py diff --git a/docs/blueprints/pydantic2.py b/docs/blueprints/pydantic2.py new file mode 100644 index 00000000..6bc684d8 --- /dev/null +++ b/docs/blueprints/pydantic2.py @@ -0,0 +1,29 @@ +from drf_spectacular.extensions import OpenApiSerializerExtension +from drf_spectacular.plumbing import ResolvedComponent + +from pydantic.json_schema import model_json_schema + + +class PydanticExtension(OpenApiSerializerExtension): + target_class = "pydantic.BaseModel" + match_subclasses = True + + def get_name(self, auto_schema, direction): + return self.target.__name__ + + def map_serializer(self, auto_schema, direction): + + # let pydantic generate a JSON schema + schema = model_json_schema(self.target, ref_template="#/components/schemas") + + # pull out potential sub-schemas and put them into component section + for sub_name, sub_schema in schema.pop("definitions", {}).items(): + component = ResolvedComponent( + name=sub_name, + type=ResolvedComponent.SCHEMA, + object=sub_name, + schema=sub_schema, + ) + auto_schema.registry.register_on_missing(component) + + return schema