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

Django查询最新及随机Games数据合并报错:int()参数类型错误

解决Django合并查询时的"int() argument must be a string..."错误

咱们先搞清楚报错的原因:你写的data1 = Games.objects.order_by('-id')[:2]返回的是包含Games模型实例的QuerySet,当你把这个QuerySet直接传给id__in的时候,Django会尝试把每个Games对象转换成整数(因为id是整数类型),但显然模型实例不是数字或字符串,所以就抛出了这个错误。

方案一:提取ID列表后合并查询

先把data1和data2里的游戏ID单独提取出来,再用这些ID去数据库查询合并结果,这样就不会有类型问题了:

# 获取最新2个游戏,同时提取它们的ID列表
data1 = Games.objects.order_by('-id')[:2]
data1_ids = [game.id for game in data1]

# 排除已选的最新游戏,用Django内置的随机排序选2个,再提取ID列表
# 用order_by('?')比sorted+random.random()更适合数据库层面的随机查询
data2 = Games.objects.exclude(id__in=data1_ids).order_by('?')[:2]
data2_ids = [game.id for game in data2]

# 通过合并后的ID列表查询最终结果
data3 = Games.objects.filter(id__in=data1_ids + data2_ids)

方案二:直接合并QuerySet(或转列表保持顺序)

如果不想再查一次数据库,可以直接合并两个QuerySet:

data1 = Games.objects.order_by('-id')[:2]
# 先提取data1的ID列表,排除这些ID后随机选2个
data2 = Games.objects.exclude(id__in=[g.id for g in data1]).order_by('?')[:2]

# 合并两个QuerySet,得到新的QuerySet(注意:合并后Django可能会调整顺序)
data3 = data1 | data2

如果需要严格保持「先最新2个,再随机2个」的顺序,直接把两个QuerySet转成列表再拼接就行:

# 转成列表后拼接,顺序完全符合预期
data3_list = list(data1) + list(data2)

关键提醒

id__in参数接收的是可迭代的ID值(整数、字符串等),不是模型实例的集合,所以一定要先提取出ID列表再传入,这是你之前代码出错的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:31:11