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

Django ValueError报错修复:int无法转换邮箱字符串及关联查询问题

解决ValueError: invalid literal for int() with base 10: 'rakash@tech.com'的问题

这个错误的根源很直观——你代码里把邮箱字符串'rakash@tech.com'当成整数来用了,而Django的setupuser_id字段需要的是整数类型的主键ID,这就导致了类型转换失败。

咱们来看你的原代码问题出在哪:

User.objects.filter(id__in=Setupuser.share_KB_with.through.objects.values_list("user_id").filter(setupuser_id=Setupuser.objects.values_list("email_id",flat=True).filter(email_id="rakash@tech.com")[0]))

这里Setupuser.objects.values_list("email_id",flat=True).filter(...)返回的是邮箱字符串,你直接把它赋值给setupuser_id,但这个字段对应的是Setupuser表的主键(整数),自然会报错。

给你两个简单的解决办法:

方法一:利用Django ORM的关联关系(推荐)

Django的ManyToManyField已经帮你封装了中间表的关联逻辑,完全不需要手动去查through表。直接先拿到目标Setupuser对象,再通过关联字段获取User:

# 先找到对应的Setupuser实例
target_setup_user = Setupuser.objects.get(email_id="rakash@tech.com")
# 直接获取该用户共享KB的所有User对象
related_users = target_setup_user.share_KB_with.all()

这个写法既简洁又符合Django ORM的最佳实践,还能避免手动操作中间表的错误。

方法二:手动查询中间表(如果有特殊需求)

如果你确实需要手动操作中间表,那要先拿到Setupuser的主键ID,而不是邮箱:

# 先获取目标Setupuser的主键ID
setupuser_id = Setupuser.objects.get(email_id="rakash@tech.com").id
# 再通过中间表过滤查询关联的User
related_users = User.objects.filter(
    id__in=Setupuser.share_KB_with.through.objects.filter(
        setupuser_id=setupuser_id
    ).values_list("user_id", flat=True)
)

这里的核心是把email_id替换成id,确保传入setupuser_id的是整数类型的主键,而不是字符串邮箱。

另外提醒一下:使用get()方法时,如果找不到对应的Setupuser会抛出DoesNotExist异常,你可以根据业务需求用filter().first()替代,或者添加异常处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:04