如何解决如何使用列表中的值来验证 pydantic BaseModel 中的某些计算?
我正在使用 Pydantic root_validator
在我的模型中执行一些计算:
class ProductLne(BaseModel):
qtt_line: float = 0.00
prix_unite: float = 0.00
so_total_ht: float = 0.00
class Config:
validate_assignment = True
@root_validator()
def calculat_so_totals(cls,values):
values["so_total_ht"] = values.get("qtt_line")*values.get("prix_unite")
return values
class Bon(BaseModel):
articles: List[ProductLne] = []
total_ht: float = 0.00
class Config:
validate_assignment = True
@root_validator()
def set_total_ht(cls,values):
for item in values.get('articles'):
values['total_ht'] += item.so_total_ht
return values
一些数据
item_line1 = ProductLne(qtt_line=10,prix_unite=10.00)
item_line2 = ProductLne(qtt_line=10,prix_unite=12.00)
bon1 = Bon()
bon1.articles.append(item_line1)
bon1.articles.append(item_line2)
运行时
print(bon1.total_ht)
我得到:0.0,O.OO 我想要 220
如何让这个函数返回正确的值?
解决方法
我发现了你的问题。这是因为您正在尝试访问 cls 上不存在的数据,并且您从值中访问数据的方式是错误的。首先,您必须在某个时刻通过 ProductLne
和 Bon
传递数据。因此,我更改了您的代码以在初始化时设置 ProductLne
的值,然后在 Bon
初始化时在验证器中对其进行初始化。然后只需运行 Bon()
,我相信这就是您要完成的任务。您仍然可以通过脚本传递数据,我只是不知道您的脚本是什么样的。示例(简化):
class ProductLne(BaseModel):
qtt_line: float = 1.0
so_total_ht: float = 1.0
@root_validator()
def calculat_so_totals(cls,values):
values["so_total_ht"] = values.get("qtt_line")
return values
class Bon(BaseModel):
articles: List[ProductLne] = []
total_ht: float = 0.0
@root_validator()
def set_total_ht(cls,values):
product_line = ProductLne()
values["articles"].append(product_line)
for item in values.get("articles"):
values["total_ht"] += item.qtt_line
return values
,
我不知道这是否是好的原因,但我得到了我想要的
invoker("Methods","goober",new Double(5.0)); //prints Double
invoker("Methods",5.0); //prints Double as before
invoker("Methods",double.class,5.0); //prints double
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。