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
相关产品推荐
相关产品推荐

