Get all required fields of a nested Python Pydantic model

Question:

My pydantic nested model is defined as below:

from pydantic import BaseModel
from typing import Optional

class Location(BaseModel):
    city: Optional[str]
    state: str
    country: str

class User(BaseModel):
    id: int
    name: Optional[str] = "Gandalf"
    age: Optional[int]
    location: Location

I would like to get all required fields for the User model.
For the above example, the expected output is ["id", "name", "state", "country"].

Any help greatly appreciated.

Asked By: lordlabakdas

||

Answers:

Here is a solution with a generator function:

from collections.abc import Iterator


def required_fields(model: type[BaseModel], recursive: bool = False) -> Iterator[str]:
    for name, field in model.__fields__.items():
        t = field.type_
        if not field.required:
            continue
        if recursive and isinstance(t, type) and issubclass(t, BaseModel):
            yield from required_fields(t, recursive=True)
        else:
            yield name

Using the models you defined in your example, we can demonstrate it like this:

print(list(required_fields(User, recursive=True)))

Output:

['id', 'state', 'country']
Answered By: Daniil Fajnberg
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.