微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用列表中的值来验证 pydantic BaseModel 中的某些计算?

如何解决如何使用列表中的值来验证 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 上不存在的数据,并且您从值中访问数据的方式是错误的。首先,您必须在某个时刻通过 ProductLneBon 传递数据。因此,我更改了您的代码以在初始化时设置 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 举报,一经查实,本站将立刻删除。