🧪 Validating Lists and Complex Types with parse_obj_as(...) in Pydantic
Sometimes you just need to validate a list of values or convert some raw data into proper Python types — without creating a full-blown Pydantic model for it.
That’s where parse_obj_as(...) comes in handy.
✅ What is parse_obj_as(...)?
It’s a helper function from Pydantic that lets you validate and parse arbitrary types — like lists, datetime, or even nested models — using the same rules you’d get from BaseModel.
No need to define an extra model just to wrap a list.
🔍 Example: List of datetime strings
pythonCopyEditfrom pydantic import parse_obj_as
from typing import List
from datetime import datetime
raw_dates = ["2024-01-01T12:00:00", "2024-01-02T08:30:00"]
parsed_dates = parse_obj_as(List[datetime], raw_dates)
print(parsed_dates[0].year) # 👉 2024
Pydantic automatically converts each ISO-formatted string into a datetime object. Super clean.
🧱 Example: List of Pydantic models
Let’s say you receive this data from an API:
pythonCopyEditdata = [
{"id": 1, "name": "banana"},
{"id": 2, "name": "apple"},
]
You can validate it like this:
pythonCopyEditfrom pydantic import BaseModel, parse_obj_as
from typing import List
class Item(BaseModel):
id: int
name: str
items = parse_obj_as(List[Item], data)
print(items[0].name) # 👉 banana
It gives you proper objects with full validation and autocomplete support in your editor.
⚠️ What if the data is invalid?
You’ll get a nice ValidationError, as expected:
pythonCopyEditbad_data = [{"id": "abc", "name": "banana"}]
parse_obj_as(List[Item], bad_data)
# ValidationError: id is not a valid integer
🧠 TL;DR
Use parse_obj_as(...) when:
You want to validate or convert raw data into Python types
You’re dealing with lists or generics (like
List[int],List[Model])You don’t want to define a wrapper
BaseModeljust for the structure
It’s one of those small Pydantic features that saves a lot of boilerplate.