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 ebc5266
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
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
33 changes: 33 additions & 0 deletions tests/test_discrimated_union.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,39 @@ 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[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 ebc5266

Please sign in to comment.