FastAPI中如何获取子模型列表中的键与值?
解决Pydantic模型实例无法通过下标访问属性的问题
错误原因
你遇到的TypeError: 'Image' object is not subscriptable,是因为Pydantic模型实例是对象而非字典,不能用['key']这种下标方式访问属性,必须用.运算符直接访问实例属性,比如image.url。
实现需求的代码示例
以下是完整的模型定义、接口实现,以及查找name为google的Image并获取对应url的逻辑:
from pydantic import BaseModel from fastapi import FastAPI app = FastAPI() # 定义Pydantic模型 class Image(BaseModel): name: str url: str class Item(BaseModel): images: list[Image] # 处理请求的接口 @app.post("/get-google-image-url/") async def get_google_image_url(item: Item): # 遍历Image列表,查找name为google的项 for img in item.images: if img.name == "google": return {"google_image_url": img.url} # 未找到时返回提示 return {"message": "不存在name为google的Image项"}
更简洁的写法(列表推导式)
如果想简化代码,可以用列表推导式过滤出目标Image:
@app.post("/get-google-image-url/") async def get_google_image_url(item: Item): # 过滤出所有name为google的Image target_images = [img for img in item.images if img.name == "google"] if target_images: # 返回第一个匹配项的url(若存在多个匹配项) return {"google_image_url": target_images[0].url} return {"message": "不存在name为google的Image项"}
额外说明:转字典访问(不推荐)
如果一定要用下标方式访问属性,可以通过img.dict()方法将Pydantic实例转为字典,但这种写法不如直接用.访问直观,不推荐:
# 示例:转字典后用下标访问 for img in item.images: img_dict = img.dict() print(img_dict['url']) # 此时不会报错,但没必要多此一举
内容的提问来源于stack exchange,提问作者Jayson Hwang
相关产品推荐
相关产品推荐

