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处理外键匹配时会自动使用主键值。
修正步骤
- 正确接收update_or_create的返回值:只提取返回元组中的Cart对象,丢弃创建状态的布尔值。
- 修复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
相关产品推荐
相关产品推荐

