使用Pydantic from_orm加载带关联列表的Django模型遇验证错误求助
问题原因
你报错的核心原因是:Foo.objects.prefetch_related("bars").all() 返回的是Django QuerySet(多个Foo对象的集合),但 FooPy 是定义单个Foo对象结构的Pydantic模型,直接把集合传给单个模型的 from_orm 方法,会导致字段验证失败——Pydantic无法将集合解析成单个Foo对象的 bars 列表。
解决方案
根据你的需求,分两种场景处理:
场景1:只需要单个Foo对象转换
把QuerySet改成获取单个实例(比如用first()、get()),再传给from_orm:
# 获取单个Foo实例 foo_db = Foo.objects.prefetch_related("bars").first() # 转换为Pydantic模型 pydantic_model = FooPy.from_orm(foo_db)
场景2:需要批量转换多个Foo对象
创建一个用于承载列表的Pydantic模型,或者直接遍历QuerySet逐个转换:
方法1:用根列表模型
from pydantic import BaseModel # 定义承载Foo列表的模型 class FooListPy(BaseModel): __root__: list[FooPy] # Pydantic V2 写法 model_config = {"from_attributes": True} # Pydantic V1 写法: # class Config: # orm_mode = True # 批量转换QuerySet foo_db = Foo.objects.prefetch_related("bars").all() pydantic_models = FooListPy.from_orm(foo_db) # 取出列表数据:pydantic_models.__root__
方法2:遍历QuerySet逐个转换
foo_db = Foo.objects.prefetch_related("bars").all() pydantic_models = [FooPy.from_orm(foo) for foo in foo_db]
注意事项
确保你的Pydantic模型正确开启了ORM模式:
- Pydantic V2:在模型中添加
model_config = {"from_attributes": True} - Pydantic V1:在模型内部定义
class Config: orm_mode = True
比如V2完整的模型写法:
from pydantic import BaseModel class BarPy(BaseModel): id: int foo_id: int model_config = {"from_attributes": True} class FooPy(BaseModel): id: int name: str bars: list[BarPy] model_config = {"from_attributes": True}
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

