Pydantic-动态创建具有多个基类的模型吗?

问题描述

pydantic docs我了解:

import pydantic

class User(pydantic.BaseModel):
    id: int
    name: str

class Student(pydantic.BaseModel):
    semester: int

# this works as expected
class Student_User(User,Student):
    building: str

print(Student_User.__fields__.keys())
#> dict_keys(['semester','id','name','building'])

但是,当我要动态创建类似对象时(遵循dynamic-model-creation部分):

# this results in a TypeError
pydantic.create_model("Student_User2",__base__=(User,Student))

我得到:

TypeError: Metaclass conflict: the Metaclass of a derived class must be a (non-strict) subclass of the Metaclasses of all its bases

问题:如何动态创建类似Student_User的类

解决方法

您的问题不是pydantic,而是python处理多重继承的方式。我假设在上面的代码中,您创建了一个同时包含UserStudent字段的类,因此一种更好的方法是

class User(pydantic.BaseModel):
    id: int
    name: str

class Student(User):
    semester: int

class Student_User(Student):
    building: str

这可以完成您的工作。因此,现在,如果您要动态创建这些模型,则可以这样做

pydantic.create_model("Student_User2",building=(str,...),__base__=Student)

很显然,building是新模型的字段,因此您可以根据需要进行更改

因此,最终的完整代码应如下所示

import pydantic

class User(pydantic.BaseModel):
    id: int
    name: str

class Student(User):
    semester: int

class Student_User(Student):
    building: str

print(Student_User.__fields__.keys())

model = pydantic.create_model("Student_User2",__base__=Student)