问题描述
据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处理多重继承的方式。我假设在上面的代码中,您创建了一个同时包含User
和Student
字段的类,因此一种更好的方法是
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)