定义常见的 Pydantic 字段,在模型中使用它们的子集

问题描述 投票:0回答:1

设置

我有一长串要在电子邮件模板中使用的变量。

示例
cust_name: str  
bill_address: str  
ship_address: str  
ref_num: int
# ...list continues

这些的重叠组合出现在模板中,我使用 Pydantic 对其进行了建模。

示例
class TemplateA(BaseModel):
    cust_name: str
    bill_address: str

class TemplateB(BaseModel):
    cust_name: str
    ref_num: int

class TemplateC(BaseModel):
    bill_address: str 
    ship_address: str

# ...and so on

问题

我想知道是否有推荐的方法来集中定义我的

variable: type
组合,这样我就不会重复自己,如果我更改变量名称或类型,这些更改会反映在各处。

Pydantic 模型继承对我不起作用,因为许多字段组合在模板模型之间混合和匹配。如果有更好的方法,我愿意完全改变我的方法。谢谢!

python design-patterns types fastapi pydantic
1个回答
0
投票

在 Python 的类型系统中不可能生成子集类型(即从一种大类型生成模型)(例如,在 Typescript 中,您可以使用

Pick
来完成此操作)。

我猜你在技术上可以为每个字段定义一个 Pydantic 模型,然后使用多重继承构建你的实际模型:

from pydantic import BaseModel

class _CustNameField(BaseModel):
    cust_name: str

class _BillAddressField(BaseModel):
    bill_address: str

class _SkipAddressField(BaseModel):
    ship_address: str

class _RefNumField(BaseModel): 
    ref_num: int

###################################

class TemplateA(_CustNameField, _BillAddressField):
    pass

class TemplateB(_CustNameField, _RefNumField):
    pass

class TemplateC(_BillAddressField, _SkipAddressField):
    pass

不确定我会推荐它,当你有很多领域时,使用它似乎很痛苦,但它会实现你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.