Django跨应用调用模型报错:invalid literal for int() with base 10: 'black' 求解决
问题原因
错误提示"invalid literal for int() with base 10: 'black'",是因为在__iter__方法中执行int(item['id'])时,item['id']的值是字符串'black'(颜色值),而非产品ID的数字字符串,无法转换为整数。
大概率是旧的Session数据结构异常导致的——比如之前调试时Session中存储了不符合当前Cart类结构的购物车数据,或者某次调用add方法时出现异常,导致id字段被错误赋值为颜色值。
解决方案
1. 清理异常Session数据
- 本地开发环境:直接清除浏览器对应域名的Cookie,或者删除项目下的
db.sqlite3文件(使用默认数据库时),也可以通过Django Admin的Sessions模块删除所有旧会话。 - 生产环境:通过Django Shell执行以下命令清理异常购物车数据:
from django.contrib.sessions.models import Session import json for session in Session.objects.all(): try: data = json.loads(session.session_data) if 'cart' in data: # 过滤出id字段合法的购物车条目 valid_cart = {} for key, item in data['cart'].items(): if 'id' in item and item['id'].isdigit(): valid_cart[key] = item data['cart'] = valid_cart session.session_data = json.dumps(data) session.save() except: # 跳过解析失败的会话 continue
2. 给__iter__方法增加容错处理
修改__iter__方法,增加对item['id']的有效性校验,避免因异常数据导致整个迭代崩溃:
def __iter__(self): cart = self.cart.copy() for item in cart.values(): # 校验id是否为合法的数字字符串 try: product_id = int(item['id']) except (ValueError, KeyError): # 跳过无效条目,也可选择删除该异常条目 continue # 捕获产品不存在的异常,避免程序崩溃 try: item['product'] = Product.objects.get(id=product_id) except Product.DoesNotExist: continue item['total'] = int(item['price']) * int(item['quantity']) yield item
3. 确保add方法的调用逻辑正确
检查调用Cart.add()方法的业务代码,确保传入的product是有效的Product实例,且product.id为整数类型——避免传入错误对象导致id字段赋值异常。
内容的提问来源于stack exchange,提问作者ali mirhashemi
相关产品推荐
相关产品推荐

