'Pydantic: How to simplify array of dicts to array of values?
I have a users model that looks like this:
class User(SQLModel, table=True):
user_id: Optional[int] = Field(default=None, primary_key=True
name: str
nationalities: Optional[List["Nationality"]] = Relationship(
back_populates="users", link_model=UsersNationality
)
occupations: List["Occupation"] = Relationship(back_populates="users")
creation_date: datetime = Field(default=datetime.utcnow())
update_date: datetime = Field(default=datetime.utcnow())
As you can see, it has two relationships: nationality and occupations. This tables look like this.
class Nationality(SQLModel, table=True):
nationality_id: Optional[int] = Field(default=None, primary_key=True)
users: Optional[List["User"]] = Relationship(
back_populates="nationalities", link_model=UsersNationality
)
class Occupation(SQLModel, table=True):
occupation_id: Optional[int] = Field(default=None, primary_key=True)
occupation: str
user_id: Optional[int] = Field(
default=None, foreign_key="user.user_id"
)
user: "User" = Relationship(back_populates="occupations")
I have some other tables but for simplicitiy's sake, when I fetch the data using FastAPI I get this response:
{
"user_id" = 3,
"name" = "John Doe",
"nationalities" = [
{"nationality" = "British"},
{"nationality" = "American"},
{"nationality" = "French"}
],
"occupations" = [
{"occupation" = "Head chef"},
{"occupation" = "Finance manager"}
]
}
The relationships are returned as a list of one key-value pair dicts which isn't ideal. I'd like to simplify this list of dicts to a regular list.
"nationalities" = ["American", "British", "French"],
"occupations" = ["Head chef", "Finance manager"]
So far I've been doing it using validators
from pydantic import validator
@validator("nationalities")
def simplify_nationality(cls, value: Optional[List["NationalityRead"]]):
return None if not value else [n.nationality for n in value]
@validator("occupations")
def simplify_occupations(cls, value: Optional[List["OccupationRead"]]):
return None if not value else [o.occupation for o in value]
But I feel there has to be a better way. Am I doing it right or not?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
