FastAPI无法为父商品创建多规格对象:请求报错排查
问题:FastAPI提交多规格商品时出现类型错误
我尝试为每个父商品创建多个尺寸和颜色规格,使用FastAPI的Swagger文档发送POST请求时出现如下错误:
{ "detail": [ { "loc": [ "body", "variations", 0 ], "msg": "value is not a valid dict", "type": "type_error.dict" } ] }
我的代码如下:
class Variation(BaseModel): size: str = None color: str = None @dataclass class Product(): title: str = Form() variations: List[Variation] = Form() @router.post("/main_product", status_code=status.HTTP_200_OK) async def create_main_product(product: Product = Depends(),current_user:get_current_user = Depends() ,db: Session = Depends(get_db)): create_parent_product = models.ParentProduct( product_title=product.title db.add(create_parent_product ) db.commit() db.refresh(create_parent_product) for variation in product.variations: variation_str = f"size:'{variation.size}',color:'{variation.color}'" varitaion_product = models.VariationProduct(parent_product_id = create_parent_product.id,variations=variation_str) db.add(varitaion_product) db.commit() db.refresh(varitaion_product)
问题原因
用@dataclass结合Form()无法处理嵌套的List[Variation]结构——Form表单默认仅支持简单数据类型,无法自动解析嵌套的字典列表,这就是报错"value is not a valid dict"的核心原因。
解决方法
改用BaseModel接收JSON格式的请求体(Swagger默认支持发送JSON请求,无需额外调整前端),具体修改如下:
- 将
Product从@dataclass改为继承BaseModel,去掉Form()依赖:
from pydantic import BaseModel, Optional from typing import List class Variation(BaseModel): size: Optional[str] = None color: Optional[str] = None class Product(BaseModel): title: str variations: List[Variation]
- 调整路由函数,直接用
Product作为请求体参数(FastAPI会自动解析JSON):
@router.post("/main_product", status_code=status.HTTP_200_OK) async def create_main_product( product: Product, current_user: get_current_user = Depends(), db: Session = Depends(get_db) ): # 创建父商品 create_parent_product = models.ParentProduct(product_title=product.title) db.add(create_parent_product) db.commit() db.refresh(create_parent_product) # 创建规格子商品 for variation in product.variations: # 建议:不要存拼接字符串,最好给VariationProduct表单独加size和color字段 # 如果必须存字符串,推荐用json.dumps转成标准JSON格式,方便后续解析 variation_str = f"size:'{variation.size}',color:'{variation.color}'" variation_product = models.VariationProduct( parent_product_id=create_parent_product.id, variations=variation_str ) db.add(variation_product) db.commit() db.refresh(variation_product) return {"msg": "商品创建成功", "parent_product_id": create_parent_product.id}
补充说明
如果必须用表单提交(比如前端是传统HTML form),需要自定义表单解析逻辑,或者使用Pydantic的from_form方法,但JSON格式更适配嵌套结构的传输,是这类场景的最优解。
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

