Django项目CSV数据提取与Product模型匹配问题求助
解决Django CSV读取索引错误及Product查询为空问题
问题1:CSV读取逻辑错误导致索引越界
你的CSV是逗号分隔的,但原教程代码错误地用分号(;)做分隔符,还多此一举把csv.reader返回的列表拼接成字符串再拆分,直接导致data变成只有单个元素的列表,自然触发IndexError。
看你的终端输出,csv.reader其实已经正确解析了每行数据:
['1', 'E100', 'TV', '1', 'Test Customer', '9/19/2022'] <class 'list'>
但你的代码执行data = " ".join(row)后再split(";"),结果data就变成了['1 E100 TV 1 Test Customer 9/19/2022'],根本没有索引1的元素。
修正后的CSV读取代码
直接使用csv.reader返回的列表即可,无需额外拼接拆分:
import csv from django.utils.dateparse import parse_date # 读取CSV文件 with open(obj.csv_file.path, 'r', encoding='utf-8') as f: reader = csv.reader(f) next(reader) # 跳过表头,用next()比__next__()更规范 for row in reader: # row已经是解析好的列表,直接按索引取值 transaction_id = row[1] product_name = row[2].strip() # 先去除前后空格,避免匹配失败 quantity = int(row[3]) customer = row[4] date_str = row[5] date = parse_date(date_str) print(transaction_id, product_name, quantity, customer, date)
问题2:product_obj始终为None
大概率是CSV中的产品名称存在前后空格,或者数据库中没有对应名称的Product记录。结合上面的修正,已经给product_name加了strip()处理,解决空格问题;同时确认以下几点:
- 管理控制台添加的Product名称和CSV中的核心名称一致(
name__iexact已忽略大小写,大小写差异不影响) - 数据库中确实存在该Product记录,可通过Django shell验证:
# 进入Django shell python manage.py shell # 查询是否存在对应产品 from yourapp.models import Product Product.objects.get(name__iexact="TV") # 替换成CSV中的产品名称,看是否能查到
修正后的Product查询逻辑
try: product_obj = Product.objects.get(name__iexact=product_name) # 这里可以添加报表逻辑,比如累加数量、记录日期等 except Product.DoesNotExist: product_obj = None # 可添加日志,记录未匹配到的产品 print(f"未找到产品: {product_name}")
完整修正后的核心代码片段
import csv from django.utils.dateparse import parse_date from yourapp.models import Product from django.http import HttpResponse # 假设这是你的视图函数中的代码 def handle_uploaded_csv(obj): with open(obj.csv_file.path, 'r', encoding='utf-8') as f: reader = csv.reader(f) next(reader) # 跳过表头 for row in reader: if len(row) < 6: print(f"无效行: {row}") continue # 跳过格式不正确的行 transaction_id = row[1] product_name = row[2].strip() quantity = int(row[3]) customer = row[4] date = parse_date(row[5]) print(transaction_id, product_name, quantity, customer, date) try: product_obj = Product.objects.get(name__iexact=product_name) # 在这里执行报表逻辑:比如累加该产品的销售数量、记录购买日期等 print(f"匹配到产品: {product_obj.name}") except Product.DoesNotExist: product_obj = None print(f"未找到产品: {product_name}") return HttpResponse("CSV处理完成")
内容的提问来源于stack exchange,提问作者sloth
相关产品推荐
相关产品推荐

