pydantic.BaseModel: 父类的类方法

pydantic.BaseModel: classmethod of a parent

如何调用父类的类方法?

我需要将 ORM 模型导入 Pydantic 模型。我知道有一个 pydantic.BaseModel.from_orm 但它对我来说不起作用,因为我有必须手动转换的字段。例如,我有一个 phone_number 字段,它本身不能表示为 str。这就是为什么我要写“我自己的另一个来自 orm 方法”的原因。

让我们忘掉 ORM。我画了一个我希望能工作的例子:

>>> class Parent(BaseModel):
...     a: int
...     @classmethod
...     def import_(cls, a: int) -> "Parent":
...         new = cls(a=a)
...         return new
>>> class Child(Parent):
...     b: int
...     @classmethod
...     def import_(cls, a: int, b: int) -> "Child":
...         new = cls(b=b, **super().import_(a).dict())
...         return new
>>> Child.import_(a=1, b=2)

不幸的是,它失败了。据我所知,super() 出于某种原因从 Child 调用 import_。好吧,也许我没有正确理解错误但是有:

pydantic.error_wrappers.ValidationError: 1 validation error for Child
b
  field required (type=value_error.missing)

1 validation error for Child
b
  field required (type=value_error.missing)

我应该写什么才能让那个例子正确存在?

为了做你想做的事,你需要显式地使用基础 class 名称来调用它的 Parent.import_(a) 方法,因为当 super() 被使用时 cls将被设置为子 class(实际对象类型)。

class Child(Parent):
    b: int

    @classmethod
    def import_(cls, a: int, b: int) -> "Child":
        parent = Parent.import_(a).dict()
        new = cls(b=b, **parent)
        return new