Python/Django中如何将嵌套子列表合并为单个一维扁平化列表
问题原因
你的代码有3个核心错误,直接导致输出不符合预期:
tickets字段存储的是字符串格式的列表,不是原生Python列表对象。你当前输出里带双引号包裹的"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']"就是字符串,直接append会把整个字符串作为单个元素存入列表,不会拆分子元素。- 多余的
ticketList.extend(ticketList)逻辑会把当前列表的所有元素复制一遍追加到自身,直接导致元素总量翻倍、出现重复内容,这是你看到索引错位、内容重复的直接原因。 - 函数最终返回的是原始QuerySet对象
userTicketModel,根本没有返回你处理的ticketList,调用方拿不到处理后的展平结果。 - 额外提一句:你用
while循环配合下标取QuerySet元素的写法效率极低,每次下标取值都会触发额外的数据库查询,完全没必要。
修复代码
import ast # 替换成你项目里CekilisModel的实际导入路径 from myapp.models import CekilisModel class Tickets(): def __init__(self, username): self.username = username def getTicketList(self): ticketList = [] # 用values_list直接取出tickets字段值,直接遍历QuerySet,避免重复查库 user_ticket_records = CekilisModel.objects.filter( username=self.username ).values_list('tickets', flat=True) for ticket_item in user_ticket_records: try: # 把字符串格式的列表转成原生列表对象 real_ticket_list = ast.literal_eval(ticket_item) # 逐元素追加,实现列表展平 ticketList.extend(real_ticket_list) except (ValueError, SyntaxError): # 兼容单个字符串票号的情况(比如你输出里出现的Y666KCF) ticketList.append(ticket_item) print(ticketList) # 返回处理好的一维列表,不要返回原始QuerySet return ticketList
注意事项
- 如果你用的是PostgreSQL数据库,且
tickets字段定义为ArrayField(原生数组类型),那不需要ast.literal_eval转义步骤,直接判断元素类型即可:元素是列表就用extend追加,是单个字符串就用append。 - 不要用
eval()做字符串转义,ast.literal_eval只会解析合法的Python字面量,不会执行任意代码,安全性更高。 - 修复后输出会和你给出的期望格式完全一致,所有嵌套元素都会被展开为一维列表,不会出现重复、字符串包裹的问题。
内容的提问来源于stack exchange,提问作者Elfo
相关产品推荐
相关产品推荐

