You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:06:01