'Can I get incoming extra fields from Pydantic?
I have defined a pydantic Schema with extra = Extra.allow
in Pydantic Config.
Is it possible to get a list or set of extra fields passed to the Schema separately.
For ex:
from pydantic import BaseModel as pydanticBaseModel
class BaseModel(pydanticBaseModel):
name: str
class Config:
allow_population_by_field_name = True
extra = Extra.allow
I pass below JSON:
{
"name": "Name",
"address": "bla bla",
"post": "post"
}
I need a function from pydantic
, if available which will return all extra fields passed.
like: {"address", "post"}
Solution 1:[1]
As far as I know, there is no out-of-the-box solution for this. But since you have access to all "raw" passed data, including extra fields, in the pre
root validator, you can put them there in a separate dictionary.
An example is taken from here. Thanks to @PrettyWood for providing it:
from typing import Any, Dict, Optional
from pydantic import BaseModel, Field, root_validator
class ComposeProject(BaseModel):
versio: Optional[str] = Field(alias='version') # just to show that it supports alias too
extra: Dict[str, Any]
@root_validator(pre=True)
def build_extra(cls, values: Dict[str, Any]) -> Dict[str, Any]:
all_required_field_names = {field.alias for field in cls.__fields__.values() if field.alias != 'extra'} # to support alias
extra: Dict[str, Any] = {}
for field_name in list(values):
if field_name not in all_required_field_names:
extra[field_name] = values.pop(field_name)
values['extra'] = extra
return values
project = ComposeProject(**{
"version": "3",
"services": ...
})
print(project.version) # => '3'
print(project.extra) # => {'services': Ellipsis}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |