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

Django报错:Product对象无法JSON序列化,求解决方案

问题根源

你遇到的Object of type Product is not JSON serializable错误,不是创建OrderItem时的问题,而是Cart类的__iter__方法把Product模型实例直接存入了session中的cart数据结构里。Django默认用JSON序列化存储session数据,而Product实例无法被JSON序列化,当请求结束Django尝试保存session时就会抛出这个错误。

看你的__iter__代码:

for product in products:
    self.cart[str(product.id)]['product']=(product)

这里的self.cart绑定到request.session,你把Product实例赋值进去后,session序列化时就会失败。

解决方法

修改Cart的__iter__方法,不要修改session中的原始cart数据,而是在迭代时临时关联Product实例,避免把不可序列化的对象存入session:

def __iter__(self):
    product_ids = self.cart.keys()
    products = Product.objects.filter(id__in=product_ids)
    # 遍历session中的原始购物车数据,不修改它
    for item in self.cart.values():
        # 根据id匹配对应的Product实例
        product = next(p for p in products if p.id == int(item['id']))
        # 创建临时字典,添加product字段和计算总价,不改动session数据
        temp_item = item.copy()
        temp_item['product'] = product
        temp_item['price'] = float(temp_item['price'])
        temp_item['total_price'] = temp_item['price'] * temp_item['quantity']
        yield temp_item

这里假设你往购物车添加商品时,session里的每个item只存id、price、quantity这些可序列化的基本类型。这样迭代时你依然能拿到Product实例用于创建OrderItem,但不会把实例存入session,从根本上解决序列化问题。

另外你之前尝试的json.dumps和serializers.serialize完全没必要——OrderItem的product字段是外键,直接传Product实例是正确的用法,问题本来就不在这一步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:05:19