(
self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc']
)
| 1098 | return self._apply_validators(v, values, loc, cls, self.validators) |
| 1099 | |
| 1100 | def _validate_discriminated_union( |
| 1101 | self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] |
| 1102 | ) -> 'ValidateReturn': |
| 1103 | assert self.discriminator_key is not None |
| 1104 | assert self.discriminator_alias is not None |
| 1105 | |
| 1106 | try: |
| 1107 | try: |
| 1108 | discriminator_value = v[self.discriminator_alias] |
| 1109 | except KeyError: |
| 1110 | if self.model_config.allow_population_by_field_name: |
| 1111 | discriminator_value = v[self.discriminator_key] |
| 1112 | else: |
| 1113 | raise |
| 1114 | except KeyError: |
| 1115 | return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc) |
| 1116 | except TypeError: |
| 1117 | try: |
| 1118 | # BaseModel or dataclass |
| 1119 | discriminator_value = getattr(v, self.discriminator_key) |
| 1120 | except (AttributeError, TypeError): |
| 1121 | return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc) |
| 1122 | |
| 1123 | if self.sub_fields_mapping is None: |
| 1124 | assert cls is not None |
| 1125 | raise ConfigError( |
| 1126 | f'field "{self.name}" not yet prepared so type is still a ForwardRef, ' |
| 1127 | f'you might need to call {cls.__name__}.update_forward_refs().' |
| 1128 | ) |
| 1129 | |
| 1130 | try: |
| 1131 | sub_field = self.sub_fields_mapping[discriminator_value] |
| 1132 | except (KeyError, TypeError): |
| 1133 | # KeyError: `discriminator_value` is not in the dictionary. |
| 1134 | # TypeError: `discriminator_value` is unhashable. |
| 1135 | assert self.sub_fields_mapping is not None |
| 1136 | return v, ErrorWrapper( |
| 1137 | InvalidDiscriminator( |
| 1138 | discriminator_key=self.discriminator_key, |
| 1139 | discriminator_value=discriminator_value, |
| 1140 | allowed_values=list(self.sub_fields_mapping), |
| 1141 | ), |
| 1142 | loc, |
| 1143 | ) |
| 1144 | else: |
| 1145 | if not isinstance(loc, tuple): |
| 1146 | loc = (loc,) |
| 1147 | return sub_field.validate(v, values, loc=(*loc, display_as_type(sub_field.type_)), cls=cls) |
| 1148 | |
| 1149 | def _apply_validators( |
| 1150 | self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'], validators: 'ValidatorsList' |
no test coverage detected