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

如何在Sqlmodel库中使用Field的alias参数解决属性名冲突?

Sqlmodel中Field的alias参数支持问题

Sqlmodel支持Field的alias参数,但和Pydantic的用法有差异——因为Sqlmodel同时兼顾ORM数据库映射和Pydantic的数据验证能力,处理嵌套模型或非数据库字段时需要额外配置。

报错原因

你遇到的问题主要有两点:

  1. schema_属性和SQLModel基类自带的schema()方法重名,直接使用alias会引发命名冲突相关错误;
  2. 继承自SQLModel的类默认会把所有字段当作数据库列处理,但Editable、List[SchemaDetail]这类嵌套模型无法映射为数据库列,必须明确标记为非数据库字段,才能让Sqlmodel按照Pydantic的逻辑处理alias。

修正后的代码

from sqlmodel import SQLModel, Field
from typing import List, Optional

class Editable(SQLModel):
    only_fact: Optional[bool] = Field(default=None)
    dispose: Optional[int] = Field(default=None)
    optional: Optional[bool] = Field(default=None)

class SchemaDetail(SQLModel):
    id: int
    title: str
    parent_id: Optional[int] = Field(default=None)
    values: List[float]

class MyClass(SQLModel):
    # 通过sa_column=None标记为非数据库字段,同时设置alias
    editable_: Editable = Field(sa_column=None, alias='editable')
    schema_: List[SchemaDetail] = Field(sa_column=None, alias='schema')

正确使用方式

当你需要用alias对应的字段名实例化对象,或者序列化输出alias字段名时,必须加上by_alias=True参数:

# 用alias字段名构造数据
raw_data = {
    "editable": {"only_fact": True},
    "schema": [{"id": 1, "title": "测试", "values": [1.5, 3.2]}]
}

# 验证数据并实例化
obj = MyClass.model_validate(raw_data, by_alias=True)

# 序列化时输出alias字段名
print(obj.model_dump(by_alias=True))

补充说明

  • 如果MyClass是需要映射到数据库表的模型,这类嵌套字段本来就不应该作为数据库列,sa_column=None是必须的;
  • 如果MyClass仅用于数据验证(和Pydantic BaseModel功能一致),即使不配置数据库表,依然需要sa_column=None——因为Sqlmodel默认会尝试将所有字段纳入ORM映射逻辑,只有明确排除后才会完全遵循Pydantic的字段规则。

内容的提问来源于stack exchange,提问作者Kaprin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:36