在 JSON 模式中更改 Pydantic 继承的 BaseModel 的属性优先级

Change Pydantic's inherited BaseModel's attribute precedence in JSON schema

我正在使用 pydantic 1.6.1fastapi 0.61.1 以及 Python 3.8.3。以下是我尝试定义模型的方式:

class UserBase(BaseModel):
    name: str

class UserCreate(UserBase):
    password: str

class UserInfo(UserBase):
    id: str
    group: Optional[GroupInfo] = None

我在这个设置中遇到的问题是,架构的构建使得 name 属性位于其余属性之上,就像这样 - 在这种情况下,使用 UserInfo作为端点的 response_model:

[
  {
    "name": "string",
    "id": "string",
    "group": {
      "name": "string"
    }
  }
]

但我希望能够像这样设置它们:

[
  {
    "id": "string",
    "name": "string",
    "group": {
      "name": "string"
    }
  }
]

有没有一种方法可以手动为 JSON 响应架构中的属性设置自定义顺序?

正如我在评论中提到的,JSON 的顺序并不重要,但在生成模式时,它可能会有所帮助。

您需要解耦 id 字段与 UserInfo模型为

<b>class UserID(BaseModel):
    id: str</b>


class UserInfo(UserBase, <b>UserID</b>): # `UserID` should be second
    group: Optional[GroupInfo] = None

这将生成以下 JSON 架构,

{
  "id": "string",
  "name": "string",
  "group": {
    "name": "string"
  }
}

有点难看的解决方案(IMO)

.__fields__ 修补为

class UserBase(BaseModel):
    name: str


class UserCreate(UserBase):
    password: str


class UserInfo(UserBase):
    id: str
    group: Optional[GroupInfo] = None


<b>fields = UserInfo.__fields__.copy()
UserInfo.__fields__ = {"id": fields.pop("id"), **fields}</b>