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

