You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()处理,解决空格问题;同时确认以下几点:

  1. 管理控制台添加的Product名称和CSV中的核心名称一致(name__iexact已忽略大小写,大小写差异不影响)
  2. 数据库中确实存在该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:21:00