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
相关产品推荐
相关产品推荐

