FastAPI Pydantic error: value is not a valid list

David Y.
jump to solution

The Problem

One of the routes in my FastAPI project produces the following error whenever I call it:

value is not a valid list (type=type_error.list)

Here is the FastAPI route function:

@router.get('', response_model = List[schemas.PostResponse])
def get_posts(db : Session = Depends(get_db)):
    posts = db.query(models.Post).all()
    return {"posts" : posts}

Here is the definition of the PostResponse Pydantic model:

from pydantic import BaseModel
from datetime import datetime

class PostResponse(BaseModel):
    user_id: int
    post_id: str
    created_at : datetime
    user : UserResponse

    class Config:
        orm_mode = True

What is causing the error and how can I fix it?

The Solution

The response_model keyword argument in @router.get indicates that the route function should return a value of type List[schemas.PostResponse]. However, the function’s return statement returns a dictionary instead ({"posts": posts}). To fix this error, we must either change the function to return the expected type or change the response_model argument to reflect the function’s return value.

Changing the return type:

@router.get('', response_model = List[schemas.PostResponse])
def get_posts(db : Session = Depends(get_db)):
    posts = db.query(models.Post).all()
    return posts # <-- changed return value

Changing response_model:

@router.get('', response_model = List[schemas.PostListResponse]) # <-- changed return type
def get_posts(db : Session = Depends(get_db)):
    posts = db.query(models.Post).all()
    return {"posts" : posts}

We must also create a PostListResponse Pydantic model to match our return value:

class PostListResponse(Base):
    posts: List[schemas.PostResponse]

Considered "not bad" by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world's best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.

Sentry