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

Django通过外键关联创建记录失败及跨系统文件路径设置咨询

问题1解答:Work模型无记录生成的原因与修复方案

错误原因

  • csv.DictReader返回的是迭代器对象,执行len(list(csv_reader))时已经把迭代器遍历消耗完毕,后续for row in csv_reader没有数据可以读取,所以不会执行创建Work的逻辑
  • Work模型的外键字段命名是file,但你创建Work对象时传的参数是file_=file_obj,字段名不匹配,就算迭代器有数据也会抛出字段不存在的错误
  • 额外注意点:你的Work模型中contributors是JSONField类型,CSV里读取的是|分隔的字符串,需要先拆分转换成列表/字典格式再存储,否则会出现类型不匹配错误

修复后代码

import os
import csv
from django.conf import settings
from .models import Files, Work

root_dir = os.path.join(settings.BASE_DIR, 'siva', 'files')
for file_name in os.listdir(root_dir):
    file_path = os.path.join(root_dir, file_name)
    # 跳过目录,只处理csv文件
    if not os.path.isfile(file_path) or not file_name.lower().endswith('.csv'):
        continue
    with open(file_path, 'r', encoding='utf-8') as csv_file:
        csv_reader = csv.DictReader(csv_file, delimiter=',')
        # 先把所有行存到列表,避免迭代器耗尽
        rows = list(csv_reader)
        # 创建Files对象直接拿到实例,不需要二次查询数据库
        file_obj = Files.objects.create(filename=file_name, work_count=len(rows))
        for row in rows:
            # 拆分contributors为列表适配JSONField要求
            contributors = row['contributors'].split('|')
            Work.objects.create(
                proprietary_id=row['proprietary_id'],
                iswc=row['iswc'],
                source=row['source'],
                title=row['title'],
                contributors=contributors,
                file=file_obj
            )
问题2解答:跨平台根目录设置方法

Django项目默认在settings.py中已经定义了BASE_DIR变量,指向当前项目的根目录,配合Python标准路径处理库就可以实现跨平台路径适配,不需要手动写不同系统的路径分隔符:

  • 使用os.path模块(兼容所有Python版本):
import os
from django.conf import settings
# 自动适配Windows、Linux、macOS的路径分隔符
root_dir = os.path.join(settings.BASE_DIR, 'siva', 'files')
  • 使用pathlib模块(Python3.4+支持,写法更简洁):
from pathlib import Path
from django.conf import settings

root_dir = Path(settings.BASE_DIR) / 'siva' / 'files'
# 遍历文件可以直接用root_dir.iterdir()代替os.listdir,用法更简单

内容的提问来源于stack exchange,提问作者ajith siva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:48:04