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

如何将SQLModel中的对象列表转为字符串列表?是否可自动实现?

解决方法

不需要手动修改全局序列化函数,SQLModel本身就有几种自动实现的方式:

方法一:使用field_serializer装饰器

这是最直接的内置方案,在Post模型里给categories字段添加序列化逻辑,自动把Category对象转成name字符串:

from sqlmodel import SQLModel, Field, Relationship, field_serializer
from sqlalchemy import Column, JSON

class Category(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str
    posts: list["Post"] = Relationship(back_populates="categories")

class Post(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    categories: list[Category] = Relationship(back_populates="posts")

    # 给categories字段添加序列化规则
    @field_serializer("categories")
    def serialize_categories(self, categories: list[Category]) -> list[str]:
        return [cat.name for cat in categories]

当你序列化Post对象(比如返回给API响应)时,categories会自动变成对应的name字符串列表,完全不需要额外处理序列化流程。

方法二:分离数据库模型与API输出模型

定义专门用于API返回的DTO(数据传输对象),直接指定categories为list[str],再从数据库模型转换:

# 数据库模型
class Category(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str
    posts: list["Post"] = Relationship(back_populates="categories")

class Post(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    categories: list[Category] = Relationship(back_populates="posts")

# API输出模型
class PostResponse(SQLModel):
    id: int
    categories: list[str]

# 查询后转换示例
from sqlmodel import Session

with Session(engine) as session:
    db_post = session.get(Post, 1)
    # 直接转换为响应模型
    response_post = PostResponse(
        id=db_post.id,
        categories=[cat.name for cat in db_post.categories]
    )

这种方式更适合复杂场景,能清晰区分数据库层和API层的数据结构,避免耦合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:42:42