如何向Pydantic的List[PrescribedDrug]类型Cart添加PrescribedDrug对象?
嘿,我来帮你理清这个问题~
你遇到的报错核心原因是:Cart只是一个类型别名,不是实际的列表实例。你写的Cart = List[PrescribedDrug]只是告诉Python"当我提到Cart时,指的是List[PrescribedDrug]这种类型",但它本身并不是一个可以调用方法的列表对象,所以直接去调用Cart.__add__或者尝试修改它,自然会抛出AttributeError。
正确的实现方式
要创建一个能添加PrescribedDrug对象的购物车,你需要先创建一个实际的列表实例,可以给它加上Cart的类型标注(这一步是可选的,但能让代码更符合类型规范),之后就可以用列表的标准方法来操作了。
方法1:用append添加单个药品
这是最常用的添加单个元素的方式,直接往列表里追加对象:
from pydantic import BaseModel from typing import List class PrescribedDrug(BaseModel): ean: str repayment: str Cart = List[PrescribedDrug] drug1 = PrescribedDrug.parse_obj({ "ean": "5055565722000", "repayment": "" }) drug2 = PrescribedDrug.parse_obj({ "ean": "5055565722001", "repayment": "" }) # 创建空的购物车实例,标注类型为Cart cart1: Cart = [] cart1.append(drug1) cart1.append(drug2) print(cart1) # 输出结果: # [PrescribedDrug(ean='5055565722000', repayment=''), PrescribedDrug(ean='5055565722001', repayment='')]
方法2:用+运算符合并列表
如果你想把多个药品组成的列表和现有购物车合并,+运算符会返回一个新的列表:
# 初始购物车已有drug1 cart1: Cart = [drug1] # 合并包含drug2的列表,得到新购物车 cart2 = cart1 + [drug2] print(cart2)
方法3:用extend批量添加药品
如果要一次性把多个药品添加到现有购物车(直接修改原列表),用extend方法:
cart1: Cart = [] cart1.extend([drug1, drug2]) print(cart1)
额外优化建议:用类封装购物车(可选)
如果你的购物车后续需要更多自定义逻辑(比如计算总金额、验证药品合法性等),可以把Cart定义成一个继承自BaseModel的类,这样扩展性更强:
from pydantic import BaseModel from typing import List, Iterator class PrescribedDrug(BaseModel): ean: str repayment: str class Cart(BaseModel): items: List[PrescribedDrug] = [] # 自定义添加药品的方法 def add_drug(self, drug: PrescribedDrug) -> None: self.items.append(drug) # 支持迭代,方便遍历购物车 def __iter__(self) -> Iterator[PrescribedDrug]: return iter(self.items) # 使用示例 cart = Cart() cart.add_drug(drug1) cart.add_drug(drug2) print(cart.items)
这种封装方式更符合面向对象的设计思路,也让购物车的逻辑更清晰易维护。
内容的提问来源于stack exchange,提问作者M. Siwik




