Python 创建ID为的对象并填充其他字段

Python 创建ID为的对象并填充其他字段,python,fastapi,pydantic,Python,Fastapi,Pydantic,我只想构造一个ID为的Pydantic对象,然后根据ID填充其他字段。 我尝试了两种不同的方法,验证器和后期初始化。两者都不起作用,所以 通用代码: 来自pydantic导入BaseModel,验证程序 对象列表=[ {'id':1,'name':'a','desc':'desc1'}, {'id':2,'name':'b','desc':'desc2'}, {'id':3,'name':'c','desc':'desc3'} ] 解决方案1: Obj类(基本模型): id:int 名称:st

我只想构造一个ID为的Pydantic对象,然后根据ID填充其他字段。
我尝试了两种不同的方法,验证器和后期初始化。两者都不起作用,所以

通用代码:

来自pydantic导入BaseModel,验证程序
对象列表=[
{'id':1,'name':'a','desc':'desc1'},
{'id':2,'name':'b','desc':'desc2'},
{'id':3,'name':'c','desc':'desc3'}
]
解决方案1:

Obj类(基本模型):
id:int
名称:str=None
desc:str=None
@验证器('id')
def validate_存在(cls,v):
items=[h表示对象列表中的h,如果h['id']==v]
如果len(项目)==0:
raise VALUERROR('id不存在')
返回v
定义后初始化(自):
item=[h表示对象列表中的h,如果h['name']==v][0]
self.name=项目['name']
self.desc=项目['desc']
Obj(id=1)
# 
解决方案2:

Obj类(基本模型):
名称:str=None
desc:str=None
id:int
@验证器('id')
def validate_存在(cls、v、值):
items=[h表示对象列表中的h,如果h['id']==v]
如果len(项目)==0:
raise VALUERROR('id不存在')
项目=项目[0]
值['name']=项['name']
值['desc']=项目['desc']
返回v
Obj(id=1)
# 
我觉得这是可行的。我阅读了Pydantic和FastApi的文档,但找不到任何与此相关的内容。
那么,如何仅使用ID构造对象,然后使用DB或其他对象填充字段

\uuu post\uu init\uuuu
不存在,我认为您将其与数据类混淆了

Pydantic验证应该在创建模型对象时进行一次。尽管您可以通过使用解决此问题

有两种解决方案:

  • 仅使用
    id
    创建每个模型,然后使用属性分配设置其他字段。这将是缓慢的,我认为是错误的方法
  • 在获得创建模型所需的所有数据之前,不要创建模型。我认为这是最好的办法

  • 我使用pydantic中的
    root\u验证器解决了这个问题

    from pydantic import BaseModel, root_validator
    
    obj_list = [
        {'id': 1, 'name': 'a', 'desc': 'desc1'},
        {'id': 2, 'name': 'b', 'desc': 'desc2'},
        {'id': 3, 'name': 'c', 'desc': 'desc3'}
    ]
    class Obj(BaseModel):
        id: int
        name: str = None
        desc: str = None
    
        @root_validator(pre=True)
        def validate_exists(cls, values):
            if 'id' not in values:
                raise ValueError("id doesn't exist in the fields")
            items = [h for h in obj_list if h['id'] == values['id']]
            if len(items) == 0:
                raise ValueError(f"there is no obj with id {values['id']}")
            return items[0]
    
    Obj(id=1)