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

Django报错:Field id期望数字却得到<Cart: John's cart>问题排查

问题分析与解决方案

错误根源

Cart.objects.update_or_create() 返回的是**(对象实例, 是否新创建)**的元组,你直接把这个元组赋值给了usercart。当你用cart=usercart筛选Entry时,Django的外键字段默认会尝试获取关联对象的主键(也就是Cart的id),但元组无法被解析成数字id,所以抛出Field id expected a number but got <Cart: John's cart>的错误。这里提到id是因为Entry的cart外键关联的是Cart模型的主键(默认字段为id),Django处理外键匹配时会自动使用主键值。

修正步骤

  1. 正确接收update_or_create的返回值:只提取返回元组中的Cart对象,丢弃创建状态的布尔值。
  2. 修复Entry的更新逻辑:原代码中直接给QuerySet赋值quantity不会生效,需要用update()方法批量更新,或者获取单个对象后保存。

修正后的完整代码

class CreateCart(generics.CreateAPIView):
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = CartSerializer   
    def post(self, request):
        user = User.objects.get(id=request.data.get("user"))
        total = request.data.get("carttotal")
        # 提取update_or_create返回的Cart对象
        usercart, _ = Cart.objects.update_or_create(user=user, cart_total=total)
        products = request.data.getlist("products")
        for product in products:
            obj = json.loads(product)
            id = obj.get("id")
            qty = obj.get("qty")
            product = Product.objects.get(id=id)
            # 筛选当前购物车中该商品的条目
            entry_qs = Entry.objects.filter(cart=usercart, product=product)
            if entry_qs.exists():
                # 批量更新数量
                entry_qs.update(quantity=qty)
            else:
                # 创建新条目
                Entry.objects.create(product=product, cart=usercart, quantity=qty)
        return Response("Items added or updated", status=HTTP_201_CREATED)

补充说明

  • 用usercart, _ = ...代替usercart = ...,_是占位符,表示我们不需要那个“是否新创建”的布尔值。
  • entry_qs.exists()比直接判断if entry_qs:更高效,因为它只检查数据库中是否存在匹配条目,不会加载整个QuerySet。
  • entry_qs.update(quantity=qty)会直接在数据库层面更新,比获取单个对象再保存更高效。

内容的提问来源于stack exchange,提问作者crawlingdev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:00:21