Skip to content

Commit

Permalink
Fixes discriminated unions not working on aliased literal fields. Issue
Browse files Browse the repository at this point in the history
  • Loading branch information
benwah committed May 10, 2023
1 parent 11f7f90 commit 1d26e81
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
1 change: 1 addition & 0 deletions changes/5736-benwah.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This solves the (closed) issue #3849 where aliased fields that use discriminated union fail to validate when the data contains the non-aliased field name.
4 changes: 4 additions & 0 deletions pydantic/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1108,6 +1108,10 @@ def _validate_discriminated_union(

try:
discriminator_value = v[self.discriminator_alias]
# try:
# discriminator_value = v[self.discriminator_alias]
# except KeyError:
# discriminator_value = v[self.discriminator_key]
except KeyError:
return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc)
except TypeError:
Expand Down
27 changes: 27 additions & 0 deletions tests/test_discrimated_union.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,33 @@ class Pet(BaseModel):
__root__: Union[Cat, Dog] = Field(..., discriminator='pet_type')


def test_discriminated_union_validation_aliased_field():
def to_upper(field_name: str) -> str:
return field_name.upper()

class PyBase(BaseModel):
class Config:
allow_population_by_field_name = True
alias_generator = to_upper

class Dog(PyBase):
pet_type: Literal['dog']
first_name: str

class Cat(PyBase):
pet_type: Literal['cat']
first_name: str

Pet = Annotated[Union[Cat, Dog], Field(discriminator='pet_type')]

class Model(PyBase):
pet: Pet

m = Model.parse_obj({'pet': {'pet_type': 'cat', 'first_name': 'Benoit'}})

assert isinstance(m.pet, Cat)


def test_discriminated_union_validation():
class BlackCat(BaseModel):
pet_type: Literal['cat']
Expand Down

0 comments on commit 1d26e81

Please sign in to comment.