diff --git a/src/py_avro_schema/_schemas.py b/src/py_avro_schema/_schemas.py index 1d8f487..60c4d80 100644 --- a/src/py_avro_schema/_schemas.py +++ b/src/py_avro_schema/_schemas.py @@ -862,6 +862,7 @@ def _record_field(self, py_field: dataclasses.Field) -> RecordField: default=default, options=self.options, ) + return field_obj @@ -899,6 +900,9 @@ def _record_field(self, name: str, py_field: pydantic.fields.FieldInfo) -> Recor docs=py_field.description or "", options=self.options, ) + # allow to use pydantic models as default values + if PydanticSchema.handles_type(default.__class__): + field_obj.default = default.model_dump(mode="json") # type: ignore return field_obj def _annotation(self, field_name: str) -> Type: diff --git a/tests/test_pydantic.py b/tests/test_pydantic.py index d1d06a9..3647a40 100644 --- a/tests/test_pydantic.py +++ b/tests/test_pydantic.py @@ -523,3 +523,28 @@ class PyType(Base): ], } assert_schema(PyType, expected) + + +def test_base_model_defaults(): + class Default(pydantic.BaseModel): + field_a: str = "default_a" + + class PyType(pydantic.BaseModel): + default: Default = pydantic.Field(..., default_factory=Default) + + expected = { + "fields": [ + { + "default": {"field_a": "default_a"}, + "name": "default", + "type": { + "fields": [{"default": "default_a", "name": "field_a", "type": "string"}], + "name": "Default", + "type": "record", + }, + } + ], + "name": "PyType", + "type": "record", + } + assert_schema(PyType, expected)