如何将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
相关产品推荐
相关产品推荐

