@@ -454,3 +454,59 @@ class Item(BaseModel):
454454 )
455455
456456 assert s .to_python (DBUser (name = 'John' , password = 'secret' )) == {'name' : 'John' }
457+
458+
459+ def test_union_serializes_list_of_model_subclass_from_definition () -> None :
460+ class BaseModel :
461+ __slots__ = '__dict__' , '__pydantic_fields_set__' , '__pydantic_extra__' , '__pydantic_private__'
462+
463+ def __init__ (self , ** kwargs : Any ):
464+ for key , value in kwargs .items ():
465+ setattr (self , key , value )
466+
467+ class User (BaseModel ):
468+ name : str
469+
470+ class DBUser (User ):
471+ password : str
472+ __pydantic_serializer__ : ClassVar [SchemaSerializer ]
473+
474+ DBUser .__pydantic_serializer__ = SchemaSerializer (
475+ core_schema .model_schema (
476+ DBUser ,
477+ core_schema .model_fields_schema (
478+ {
479+ 'name' : core_schema .model_field (core_schema .str_schema ()),
480+ 'password' : core_schema .model_field (core_schema .str_schema ()),
481+ }
482+ ),
483+ )
484+ )
485+
486+ class Item (BaseModel ):
487+ price : float
488+
489+ s = SchemaSerializer (
490+ core_schema .definitions_schema (
491+ core_schema .union_schema (
492+ [
493+ core_schema .list_schema (core_schema .definition_reference_schema ('User' ), strict = False ),
494+ core_schema .list_schema (core_schema .definition_reference_schema ('Item' ), strict = False ),
495+ ]
496+ ),
497+ [
498+ core_schema .model_schema (
499+ User ,
500+ core_schema .model_fields_schema ({'name' : core_schema .model_field (core_schema .str_schema ())}),
501+ ref = 'User' ,
502+ ),
503+ core_schema .model_schema (
504+ Item ,
505+ core_schema .model_fields_schema ({'price' : core_schema .model_field (core_schema .float_schema ())}),
506+ ref = 'Item' ,
507+ ),
508+ ],
509+ )
510+ )
511+
512+ assert s .to_python ([DBUser (name = 'John' , password = 'secret' )]) == [{'name' : 'John' }]
0 commit comments