在Django中遍历元组列表并匹配返回对应元组值的问题
问题分析与解决方案
你的代码存在几个关键问题导致无法找到匹配项:
- 比较对象错误:你用
UserNobats实例usernobat和元组中的元素(整数序号或CalculatedNumbers对象)直接比较,两者类型完全不同,永远不会相等。你需要使用的是usernobat.usernobat这个数值字段。 - 循环逻辑冗余且目标错误:内层循环遍历元组的两个元素完全没必要,你只需要检查元组的第一个元素(序号)是否匹配,然后返回对应的第二个元素(
CalculatedNumbers对象)即可,而不是把序号赋值给matching_object。 - 缩进问题:原代码中循环内的代码缩进不正确,可能导致逻辑执行异常。
修正后的代码实现
方法一:普通循环(可读性高)
def cart_resault(request): carts = CalculatedNumbers.objects.filter(used=False)[:50] usersubmit = UserSelection.objects.get(user=request.user) usernobat, usernobat__created = UserNobats.objects.get_or_create(user=request.user) numbers_sum = sum(getattr(usersubmit, f'number_{i}', 0) for i in range(1, 11)) usernobat.usernobat = numbers_sum usernobat.save() numbered_objects = [(index + 1, obj) for index, obj in enumerate(carts)] matching_object = None # 直接遍历每个元组的序号和对象 for number, obj in numbered_objects: # 比较序号与usernobat.usernobat数值 if number == usernobat.usernobat: matching_object = obj break
方法二:使用next()函数(更简洁)
可以用生成器表达式结合next()函数实现一行查找,找不到时返回None:
def cart_resault(request): carts = CalculatedNumbers.objects.filter(used=False)[:50] usersubmit = UserSelection.objects.get(user=request.user) usernobat, usernobat__created = UserNobats.objects.get_or_create(user=request.user) numbers_sum = sum(getattr(usersubmit, f'number_{i}', 0) for i in range(1, 11)) usernobat.usernobat = numbers_sum usernobat.save() numbered_objects = [(index + 1, obj) for index, obj in enumerate(carts)] # 一行实现查找,找不到返回None matching_object = next((obj for number, obj in numbered_objects if number == usernobat.usernobat), None)
关键说明
- 核心逻辑是匹配元组的第一个元素(序号)与
usernobat.usernobat的数值,而不是和UserNobats实例本身比较。 - 两种方法都能准确找到对应序号的
CalculatedNumbers对象,你可以根据代码可读性需求选择。
内容的提问来源于stack exchange,提问作者Essiprog
相关产品推荐
相关产品推荐

