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 8131196 commit 6173cfa
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
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.
5 changes: 4 additions & 1 deletion pydantic/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1107,7 +1107,10 @@ def _validate_discriminated_union(
assert self.discriminator_alias is not None

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 6173cfa

Please sign in to comment.