gpt4 book ai didi

python - 创建带有 ID 的对象并填充其他字段

转载 作者:行者123 更新时间:2023-12-04 10:24:13 24 4
gpt4 key购买 nike

我只想用ID构造一个Pydantic对象,然后根据ID填充其他字段。
我尝试了 2 种不同的方法,验证器和 post init。都没有工作,所以。

常用代码:

from pydantic import BaseModel, validator

obj_list = [
{'id': 1, 'name': 'a', 'desc': 'desc1'},
{'id': 2, 'name': 'b', 'desc': 'desc2'},
{'id': 3, 'name': 'c', 'desc': 'desc3'}
]

解决方案1:

class Obj(BaseModel):
id: int
name: str = None
desc: str = None

@validator('id')
def validate_exists(cls, v):
items = [h for h in obj_list if h['id'] == v]
if len(items) == 0:
raise ValueError('id doesnt exist')
return v

def __post_init__(self):
item = [h for h in obj_list if h['name'] == v][0]
self.name = item['name']
self.desc = item['desc']

Obj(id=1)
# <Obj id=1 name=None desc=None>

解决方案2:

class Obj(BaseModel):
name: str = None
desc: str = None
id: int

@validator('id')
def validate_exists(cls, v, values):
items = [h for h in obj_list if h['id'] == v]
if len(items) == 0:
raise ValueError('id doesnt exist')
item = items[0]
values['name'] = item['name']
values['desc'] = item['desc']
return v

Obj(id=1)
# <Obj name=None desc=None id=1>

我觉得是可行的。我阅读了 Pydantic 和 FastApi 的文档,但找不到与此相关的任何内容。
那么,如何仅使用 ID 构造对象,然后使用 DB 或其他对象填充字段?

最佳答案

__post_init__不存在,我认为您对数据类感到困惑。

当您创建模型对象时,Pydantic 事物验证应该发生一次。虽然你可以通过使用 Config.validate_assignment 来解决这个问题。 .

对此有两种解决方案:

  • 仅使用 id 创建每个模型然后使用属性分配来设置其他字段。这会更慢,我认为这是错误的方法。
  • 在您拥有创建模型所需的所有数据之前,不要创建模型。我建议这是最好的方法。
  • 关于python - 创建带有 ID 的对象并填充其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60695759/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com