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

更改Pydantic';s继承的BaseModel';JSON模式中的s属性优先级,json,python-3.x,fastapi,pydantic,Json,Python 3.x,Fastapi,Pydantic,我在Python3.8.3中使用了pydantic 1.6.1和fastapi 0.61.1。下面是我如何定义模型的: class UserBase(BaseModel): name: str class UserCreate(UserBase): password: str class UserInfo(UserBase): id: str group: Optional[GroupInfo] = None 我在这个设置中遇到的问题是,架构的构建使得nam

我在Python3.8.3中使用了
pydantic 1.6.1
fastapi 0.61.1
。下面是我如何定义模型的:

class UserBase(BaseModel):
    name: str

class UserCreate(UserBase):
    password: str

class UserInfo(UserBase):
    id: str
    group: Optional[GroupInfo] = None
我在这个设置中遇到的问题是,架构的构建使得
name
属性位于其他属性之上,就像这样-在本例中,使用
UserInfo
作为端点的
响应\u模型

[
  {
    "name": "string",
    "id": "string",
    "group": {
      "name": "string"
    }
  }
]
但我希望能够像这样设置它们:

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

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

正如我在评论中提到的,JSON的顺序实际上并不重要,但在生成模式时,它会很有帮助

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

class UserID(BaseModel):
    id: str


class UserInfo(UserBase, UserID): # `UserID` should be second
    group: Optional[GroupInfo] = None
更丑陋的解决方案(IMO) 将
\uuuu字段作为

class UserBase(BaseModel):
    name: str


class UserCreate(UserBase):
    password: str


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


fields = UserInfo.__fields__.copy()
UserInfo.__fields__ = {"id": fields.pop("id"), **fields}
class用户库(BaseModel):
姓名:str
类UserCreate(UserBase):
密码:str
类UserInfo(UserBase):
id:str
组:可选[GroupInfo]=无
fields=UserInfo.\uuuuu字段\uuuuuu.copy()

UserInfo.\uuuu fields\uuuu={“id”:fields.pop(“id”),**fields}
顺序真的重要吗@ArakkalAbu在宏伟的计划中,不是真的。尽管如此,我还是希望这个选项可以用于演示目的。只是测试了一下,两种解决方案都很好用。如果需要
id
字段的特定于实体的名称(例如
user\u id
),并且为多个域实体定义各种
id
模型是不实际的,那么第二种方法可能很有意思。
class UserBase(BaseModel):
    name: str


class UserCreate(UserBase):
    password: str


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


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