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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:23:14