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
如何调用父类的类方法?
我需要将 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