'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