python - 如何扩展 pydantic 对象并更改某些文件的类型?
问题描述
有两个类似的 pydantic 对象。唯一的区别是某些字段是可选的。如何在一个对象中定义字段并扩展到另一个对象?
class ProjectCreateObject(BaseModel):
project_id: str
project_name: str
project_type: ProjectTypeEnum
depot: str
system: str
...
class ProjectPatchObject(ProjectCreateObject):
project_id: str
project_name: Optional[str]
project_type: Optional[ProjectTypeEnum]
depot: Optional[str]
system: Optional[str]
...
解决方案
我找到了一个好而简单的方法__init__subclass__
。文档也可以成功生成。
class ProjectCreateObject(BaseModel):
project_id: str
project_name: str
project_type: ProjectTypeEnum
depot: str
system: str
...
def __init_subclass__(cls, optional_fields=None, **kwargs):
"""
allow some fields of subclass turn into optional
"""
super().__init_subclass__(**kwargs)
if optional_fields:
for field in optional_fields:
cls.__fields__[field].outer_type_ = Optional
cls.__fields__[field].required = False
_patch_fields = ProjectCreateObject.__fields__.keys() - {'project_id'}
class ProjectPatchObject(ProjectCreateObject, optional_fields=_patch_fields):
pass
推荐阅读
- machine-learning - 使用 Cython 或 numpy 在 Python 中加速 DBSCAN 算法(从头开始)
- javascript - 如何在Javascript中将所有文本在x轴上旋转x度
- php - 如何在laravel中使用json字符串将大数据插入数据库?
- reactjs - 为什么要在 render() 方法之外定义无状态函数?
- php - Guzzle 不读取身体值
- javascript - 扁平化字符串字典和字典
- javascript - What technologies are used in the editor of Canva
- python - 训练问题,Val 损失和准确率不变
- airflow - 如何计算 Airflow DAG 的总执行时间
- ethereum - web3.eth.getAccounts(); 当前不工作