在 JSON 模式中更改 Pydantic 继承的 BaseModel 的属性优先级
Change Pydantic's inherited BaseModel's attribute precedence in JSON schema
我正在使用 pydantic 1.6.1
和 fastapi 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>
我正在使用 pydantic 1.6.1
和 fastapi 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>