【问题标题】:Pydantic - Dynamically create a model with multiple base classes?Pydantic - 动态创建具有多个基类的模型?
【发布时间】:2020-10-23 06:58:59
【问题描述】:

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这样的类

【问题讨论】:

    标签: python multiple-inheritance pydantic


    【解决方案1】:

    您的问题不在于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", building=(str, ...), __base__=Student)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2023-04-10
      • 2021-01-29
      • 1970-01-01
      • 2020-07-04
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多