You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求,无需额外调整前端),具体修改如下:

  1. 将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]
  1. 调整路由函数,直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:05:44