【问题标题】:unable to create recs via foreign key association in django无法通过 django 中的外键关联创建记录
【发布时间】:2021-09-16 13:28:16
【问题描述】:

我对 django 和 python 完全陌生,在这里需要您的见解

我正在尝试解析目录中的 csv 文件列表, 在 Files 模型中存储 name 和 row_count,在 Work 模型中存储 csv 的内容(与 Files 关联)

我有两个问题

recs 是在 Files 模型中创建的,但在 Work 模型中没有创建 recs,下面是我的代码,没有抛出任何错误消息

型号

class Files(models.Model):
    filename   = models.CharField(max_length=100)
    work_count = models.IntegerField(default=0)

class Work(models.Model):
    proprietary_id = models.IntegerField(default=0)
    iswc           = models.CharField(max_length=1000)
    source         = models.CharField(max_length=1000)
    title          = models.CharField(max_length=1000)
    contributors   = JSONField()
    file           = models.ForeignKey(Files,on_delete = models.CASCADE)

查看

root_dir="D:/Django/siva/files"
for file in os.listdir(root_dir):
   with open(f'{root_dir}/{file}','r') as csv_file:
       csv_reader= csv.DictReader(csv_file,delimiter=',')
       Files.objects.create(filename=file, work_count=len(list(csv_reader)))
       for row in csv_reader:
           file_obj=Files.objects.get(filename=file)
           print(file_obj)
           Work.objects.create(proprietary_id=row['proprietary_id'],iswc=row['iswc'],source=row['source'],title=row['title'],contributors=row['contributors'],file_=file_obj)

示例 csv 文件

title,contributors,iswc,source,proprietary_id
Shape of You,Edward Christopher Sheeran,T9204649558,sony,1
Je ne sais pas,Obispo Pascal Michel|Florence Lionel Jacques,T0046951705,sony,3

还有什么特定的方法可以设置 root_dir ,所以我不需要跨操作系统更改文件路径结构

【问题讨论】:

  • print(file_obj) 是否为每一行打印文件实例?
  • 是的,获取对象

标签: python django django-models django-rest-framework


【解决方案1】:

您的问题是DictReader 实例在您到达for row in csv_reader: 时已被消耗。当它被转换为一个列表以检索长度时,整个生成器都被消耗掉了,没有任何东西留给 forloop。

您可以通过在创建对象后立即将其转换为列表或元组来解决此问题。

csv_reader = tuple(csv.DictReader(csv_file, delimiter=','))

这将引发另一个错误,其中 file_=file_obj 实际上应该是 file=file_obj,但这是一个非常容易解决的问题。

对于您的路径问题:假设您是 Django 安装是一个相当新的安装,您应该能够导入您的设置并访问 settings.BASE_DIR

from django.conf import settings

settings.BASE_DIR

这是一个pathlib.Path 对象,应该对您非常有用。它将允许您以更自然的方式访问您的文件。

下面是我编写这段代码的方法。

root = settings.BASE_DIR / '../path/to/csv'
for path in root.iterdir():
    with path.open('r') as source:
        data = tuple(csv.DictReader(source, delimiter=','))

    file_ = Files.objects.create(filename=path.name, work_count=len(data))
    Work.objects.bulk_create([Work(file=file_, **kwargs) for kwargs in data])

【讨论】:

  • 非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多