FastAPI Pydantic error: value is not a valid list
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]
Related Answers
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.