FastAPI/SQLModel中如何指定表列与响应对象字段的展示顺序?
解决方法
1. 最通用的无冗余方案(推荐)
SQLModel的字段排序逻辑为「先继承的父类字段在前,子类自身新增字段在后」,因此可以把需要前置的id字段拆分到独立的父类中,所有需要id的模型优先继承该父类,即可同时解决数据库表列顺序、OpenAPI响应字段顺序两个问题。
import uuid from typing import Optional from pydantic import EmailStr, Extra from sqlmodel import SQLModel, Field # 单独拆分ID基类,所有需要主键id的模型优先继承该类 class IDBase(SQLModel): id: uuid.UUID = Field( default_factory=uuid.uuid4, primary_key=True, index=True, nullable=False, ) class UserBase(SQLModel): full_name: str email: EmailStr is_active: bool = True is_superuser: bool = False # 先继承IDBase,id自动排在响应字段最前面 class UserRead(IDBase, UserBase): pass class UserCreate(UserBase, extra=Extra.forbid): password: str class UserUpdate(UserBase): password: Optional[str] = None # 先继承IDBase,数据库表的id列也会排在首位 class User(IDBase, UserBase, table=True): hashed_password: Optional[str] = None
2. 不调整继承结构的方案
2.1 仅调整OpenAPI响应字段顺序
如果只需要改OpenAPI展示的字段顺序,不需要改数据库表结构,可以用Pydantic的字段顺序配置:
- Pydantic V2 配置
field_order:
class UserRead(UserBase): id: uuid.UUID model_config = { "field_order": ["id", "full_name", "email", "is_active", "is_superuser"] }
- Pydantic V1 配置
Config.fields:
class UserRead(UserBase): id: uuid.UUID class Config: fields = ["id", "full_name", "email", "is_active", "is_superuser"]
2.2 仅调整新建数据库表的列顺序
如果表还未创建,不想改继承结构的话,可以直接在表模型中按你需要的顺序显式声明所有字段:
class User(UserBase, table=True): # 先声明id,就会排在表列最前面 id: uuid.UUID = Field( default_factory=uuid.uuid4, primary_key=True, index=True, nullable=False, ) full_name: str email: EmailStr is_active: bool = True is_superuser: bool = False hashed_password: Optional[str] = None
注意:PostgreSQL本身不支持修改已存在表的列顺序,如果表已经上线,无需强制调整,大部分PostgreSQL客户端都支持自定义展示列的顺序,不影响实际使用。
内容的提问来源于stack exchange,提问作者gmagno
相关产品推荐
相关产品推荐

