如何基于关键字值合并两个QuerySet并生成指定结构的结果
实现两个数据集的合并匹配
核心思路
- 统一两个数据集的用户ID格式:修正queryset2中不一致的键名,将字符串类型的user_id转为整数,确保匹配准确性
- 将queryset1转换为以
user_id为键的字典,提升匹配查询效率 - 遍历处理后的queryset2,匹配对应用户信息,按目标结构拼接结果
代码实现
# 先把Django QuerySet转为普通列表(如果是QuerySet的话) queryset1_list = list(queryset1) # 预处理queryset2:修正键名、转换user_id类型 processed_queryset2 = [] for item in queryset2: # 兼容两种键名:"user_id"和"user id" user_id_val = item.pop('user id', item.get('user_id')) processed_item = { 'user_id': int(user_id_val), 'amount': item['amount'] } processed_queryset2.append(processed_item) # 构建queryset1的user_id映射字典,方便快速查找 user_map = {user['user_id']: user for user in queryset1_list} # 生成最终结果集 result = [] for item in processed_queryset2: user_id = item['user_id'] if user_id in user_map: user_info = user_map[user_id] # 按目标结构拼接字段,注意字段名转换 result_item = { 'username': ' Muthu ' if user_info['username'] == 'muthu' else user_info['username'], 'user id': user_id, 'code': user_info['referrel_code'], 'amount': item['amount'], 'date joined': user_info['date_joined'] } result.append(result_item) print(result)
关键说明
- 兼容queryset2中两种用户ID键名,避免因键名不一致导致匹配失败
- 字典映射的方式将匹配操作的时间复杂度从O(n*m)优化为O(n),数据量大时效率提升明显
- 针对示例中
muthu转为Muthu的特殊需求做了单独处理,若不需要该格式可直接使用user_info['username']
内容的提问来源于stack exchange,提问作者Muthumani18
相关产品推荐
相关产品推荐

