Bird
Raised Fist0
FastAPIframework~5 mins

Nested models in FastAPI

Choose your learning style10 modes available
Introduction
Nested models help organize related data inside other data, making it easier to manage and understand complex information.
When you want to represent a user with an address inside their profile.
When you have an order that contains multiple items, each with its own details.
When you need to group related settings inside a main configuration.
When your API needs to accept or return structured data with parts inside parts.
Syntax
FastAPI
from pydantic import BaseModel

class InnerModel(BaseModel):
    field1: str
    field2: int

class OuterModel(BaseModel):
    inner: InnerModel
    other_field: float
Nested models are defined by including one model as a field type inside another.
FastAPI uses Pydantic models to validate and serialize nested data automatically.
Examples
A User model contains an Address model as a nested field.
FastAPI
from pydantic import BaseModel

class Address(BaseModel):
    street: str
    city: str

class User(BaseModel):
    name: str
    address: Address
An Order model contains a list of Item models nested inside.
FastAPI
from pydantic import BaseModel
from typing import List

class Item(BaseModel):
    name: str
    price: float

class Order(BaseModel):
    items: List[Item]
    total: float
Sample Program
This FastAPI app defines a User model with a nested Address model. When you send a POST request with user data including address, it returns a confirmation message showing the user's name and city.
FastAPI
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Address(BaseModel):
    street: str
    city: str

class User(BaseModel):
    name: str
    age: int
    address: Address

@app.post("/users/")
async def create_user(user: User):
    return {"message": f"User {user.name} from {user.address.city} created."}
OutputSuccess
Important Notes
Nested models help keep your data organized and validated automatically.
You can nest models as deeply as needed, but keep readability in mind.
FastAPI automatically converts nested JSON data into nested model instances.
Summary
Nested models let you put one data model inside another to represent complex data.
FastAPI and Pydantic handle nested data validation and conversion smoothly.
Use nested models to keep your API data clear and structured.

Practice

(1/5)
1. What is the main purpose of using nested models in FastAPI?
easy
A. To represent complex data structures by embedding one model inside another
B. To speed up the API response time
C. To automatically generate HTML pages
D. To replace database models with simpler ones

Solution

  1. Step 1: Understand nested models concept

    Nested models allow you to include one Pydantic model inside another to represent complex or hierarchical data.
  2. Step 2: Identify the main purpose in FastAPI

    FastAPI uses nested models to validate and structure complex JSON data clearly and maintainably.
  3. Final Answer:

    To represent complex data structures by embedding one model inside another -> Option A
  4. Quick Check:

    Nested models = complex data representation [OK]
Hint: Nested models = models inside models for complex data [OK]
Common Mistakes:
  • Thinking nested models improve speed
  • Confusing nested models with HTML generation
  • Assuming nested models replace databases
2. Which of the following is the correct way to define a nested model in FastAPI using Pydantic?
easy
A. class User(BaseModel): name: str; address: str
B. class Address(BaseModel): street: str; class User(BaseModel): name: str; address: Address
C. class User(BaseModel): name: str; address = Address()
D. class Address: street: str; class User: name: str; address: Address

Solution

  1. Step 1: Check Pydantic model syntax

    Models must inherit from BaseModel and use type annotations for fields.
  2. Step 2: Verify nested model usage

    Nested models are declared by using the nested model class as a type annotation for a field.
  3. Final Answer:

    class Address(BaseModel): street: str; class User(BaseModel): name: str; address: Address -> Option B
  4. Quick Check:

    Nested model as type annotation = correct syntax [OK]
Hint: Use nested model class as field type with BaseModel inheritance [OK]
Common Mistakes:
  • Not inheriting from BaseModel
  • Assigning nested model instance instead of type
  • Using plain classes without BaseModel
3. Given the following FastAPI models:
class Item(BaseModel): name: str; price: float
class Order(BaseModel): id: int; item: Item

What will be the output of Order(id=1, item={'name': 'Book', 'price': 12.5}).item.price?
medium
A. None
B. '12.5'
C. Error: item must be an Item instance
D. 12.5

Solution

  1. Step 1: Understand nested model instantiation

    FastAPI/Pydantic automatically converts nested dicts to model instances when creating the parent model.
  2. Step 2: Access nested attribute

    Accessing item.price returns the float value 12.5 from the nested Item model.
  3. Final Answer:

    12.5 -> Option D
  4. Quick Check:

    Nested dict converts to model, attribute accessed = 12.5 [OK]
Hint: Nested dicts auto-convert to models, access attributes normally [OK]
Common Mistakes:
  • Expecting string instead of float
  • Thinking nested dicts cause errors
  • Assuming nested model must be instance, not dict
4. Identify the error in this FastAPI nested model code:
class Profile(BaseModel): age: int
class User(BaseModel): username: str; profile = {"age": 30}
medium
A. Missing type annotation for profile field
B. Profile class must inherit from BaseSettings, not BaseModel
C. Default value for nested model must be a Profile instance, not a dict
D. username field should be Optional[str]

Solution

  1. Step 1: Check field type annotations

    All Pydantic model fields require type annotations (: Type) for proper validation, especially for nested models.
  2. Step 2: Identify the missing annotation

    The profile field lacks type annotation: it should be profile: Profile = {"age": 30} or profile: Profile = Profile(age=30) to enable nested model validation.
  3. Final Answer:

    Missing type annotation for profile field -> Option A
  4. Quick Check:

    Type annotation required for nested model fields [OK]
Hint: All model fields must have type annotations: field: Type [OK]
Common Mistakes:
  • Using dict instead of model instance as default
  • Ignoring type annotations
  • Confusing BaseModel with BaseSettings
5. You want to create a FastAPI model for a blog post with nested author info. The author has name and email. The post has title, content, and author. Which code correctly defines these nested models and validates that the author's email is a valid email address?
hard
A. class Author(BaseModel): name: str; email: str class Post(BaseModel): title: str; content: str; author: Author @validator('email') def check_email(cls, v): return v
B. class Author(BaseModel): name: str; email: str class Post(BaseModel): title: str; content: str; author: dict
C. class Author(BaseModel): name: str; email: EmailStr class Post(BaseModel): title: str; content: str; author: Author
D. class Author(BaseModel): name: str; email: EmailStr class Post(BaseModel): title: str; content: str; author: dict

Solution

  1. Step 1: Use EmailStr for email validation

    Pydantic provides EmailStr type to validate email addresses automatically.
  2. Step 2: Define nested models correctly

    Author model uses EmailStr, Post model nests Author as a field with correct type annotation.
  3. Final Answer:

    class Author(BaseModel): name: str; email: EmailStr class Post(BaseModel): title: str; content: str; author: Author -> Option C
  4. Quick Check:

    EmailStr + nested Author model = correct validation [OK]
Hint: Use EmailStr type and nested model as field type [OK]
Common Mistakes:
  • Using plain str for email without validation
  • Setting author field as dict instead of Author model
  • Trying to validate email with incorrect validator placement
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard