diff --git a/src/serializers/type_serializers/dataclass.rs b/src/serializers/type_serializers/dataclass.rs index e5cf15199..5b3c425df 100644 --- a/src/serializers/type_serializers/dataclass.rs +++ b/src/serializers/type_serializers/dataclass.rs @@ -43,15 +43,17 @@ impl BuildSerializer for DataclassArgsBuilder { let key_py: Py = PyString::new(py, &name).into(); - if field_info.get_as(intern!(py, "serialization_exclude"))? == Some(true) { - fields.insert(name, SerField::new(py, key_py, None, None, true)); - } else { - let schema = field_info.get_as_req(intern!(py, "schema"))?; - let serializer = CombinedSerializer::build(&schema, config, definitions) - .map_err(|e| py_schema_error_type!("Field `{}`:\n {}", index, e))?; - - let alias = field_info.get_as(intern!(py, "serialization_alias"))?; - fields.insert(name, SerField::new(py, key_py, alias, Some(serializer), true)); + if !field_info.get_as(intern!(py, "init_only"))?.unwrap_or(false) { + if field_info.get_as(intern!(py, "serialization_exclude"))? == Some(true) { + fields.insert(name, SerField::new(py, key_py, None, None, true)); + } else { + let schema = field_info.get_as_req(intern!(py, "schema"))?; + let serializer = CombinedSerializer::build(&schema, config, definitions) + .map_err(|e| py_schema_error_type!("Field `{}`:\n {}", index, e))?; + + let alias = field_info.get_as(intern!(py, "serialization_alias"))?; + fields.insert(name, SerField::new(py, key_py, alias, Some(serializer), true)); + } } } diff --git a/tests/serializers/test_dataclasses.py b/tests/serializers/test_dataclasses.py index eb4bede97..d7fbcffaf 100644 --- a/tests/serializers/test_dataclasses.py +++ b/tests/serializers/test_dataclasses.py @@ -192,3 +192,46 @@ class Model: m = v.validate_python({'extra': 'extra'}) assert s.to_python(m) == {'extra': 'extra bam!'} + + +def test_dataclass_initvar_not_required_on_union_ser() -> None: + @dataclasses.dataclass + class Foo: + x: int + init_var: dataclasses.InitVar[int] = 1 + + @dataclasses.dataclass + class Bar: + x: int + + schema = core_schema.union_schema( + [ + core_schema.dataclass_schema( + Foo, + core_schema.dataclass_args_schema( + 'Foo', + [ + core_schema.dataclass_field(name='x', schema=core_schema.int_schema()), + core_schema.dataclass_field( + name='init_var', + init_only=True, + schema=core_schema.with_default_schema(core_schema.int_schema(), default=1), + ), + ], + ), + ['x'], + post_init=True, + ), + core_schema.dataclass_schema( + Bar, + core_schema.dataclass_args_schema( + 'Bar', [core_schema.dataclass_field(name='x', schema=core_schema.int_schema())] + ), + ['x'], + ), + ] + ) + + s = SchemaSerializer(schema) + assert s.to_python(Foo(x=1), warnings='error') == {'x': 1} + assert s.to_python(Foo(x=1, init_var=2), warnings='error') == {'x': 1}