Pydantic BaseModel如何获取SQLAlchemy多对一关联模型的指定字段值
解决方案
你写法不生效的核心原因是Pydantic不同版本的关联字段取值参数不同,同时缺少必要配置,具体实现如下:
如果你使用的是Pydantic V2(当前主流版本)
有两种常用实现方式:
方式1:通过Field的alias参数实现
from pydantic import BaseModel, Field class Picnics(BaseModel): id: int # 如果要返回字段名为city,直接把下面的city_name改成city即可 city_name: str = Field(alias="city.name") class Config: orm_mode = True populate_by_name = True # 必须添加该配置,允许通过别名从ORM对象取嵌套属性
方式2:通过computed_field实现(更直观,不需要额外配置别名)
from pydantic import BaseModel, computed_field from typing import Any class Picnics(BaseModel): id: int # 引入关联的city对象,不需要对外暴露的话可以加exclude配置隐藏 city: Any # 如果你已有City对应的Pydantic模型,也可以直接写对应模型类名 class Config: orm_mode = True exclude = {"city"} # 配置后返回结果不会包含city原始对象 @computed_field @property def city_name(self) -> str: return self.city.name
如果你使用的是Pydantic V1
只需要补充allow_population_by_field_name配置即可:
from pydantic import BaseModel, Field class Picnics(BaseModel): id: int city_name: str = Field(source="city.name") class Config: orm_mode = True allow_population_by_field_name = True
额外性能优化建议
如果查询Picnic数据时没有提前关联加载city对象,SQLAlchemy会触发懒加载,异步环境下会直接报错,同步环境下也会额外多发起SQL查询影响性能,建议查询时提前join关联表:
from sqlalchemy.orm import joinedload # 同步查询示例 picnics = db.query(Picnic).options(joinedload(Picnic.city)).all()
内容的提问来源于stack exchange,提问作者vanookay1
相关产品推荐
相关产品推荐

