Django:生成一个CSV文件并将其存储到FileField中

时间:2017-03-12 16:11:41

标签: python django csv filefield

在我的Django View文件中,我需要从元组列表生成CSV文件,并将CSV文件存储到我模型的FileField中。

show do
  field :images do
    # Display as a gallery
  end
end

我在这个网站上搜索过,发现了一些帖子,例如Django - how to create a file and save it to a model's FileField?,但解决方案可以帮助我。

我需要将CSV文件存储在' media / bills /' fold,我希望CSV文件可以与数据库中的Bill对象一起删除。

我尝试了以下代码,但它无法满足我的要求。对于每个文件,它将生成两个文件" output.csv'和' output_xxesss.csv'。无法通过调用' Bill.objects.all()删除这两个文件。删除()'。

class Bill(models.Model):
    billId = models.IntegerField()
    bill = models.FileField(upload_to='bills')

由于

我尝试了以下代码,但无法通过调用' Bill.objects.all()删除文件。删除()'。

path = join(settings.MEDIA_ROOT, 'bills', 'output.csv')
print path
f = open(path, 'w+b')
f.truncate()
csvWriter = csv.writer(f)
csvWriter.writerow(('A', 'B', 'C'))
for r in rs:
    print r
    csvWriter.writerow(convert(r))

bill = Bill()
bill.billId = 14
bill.bill.save('output.csv', File(f))
bill.save()

2 个答案:

答案 0 :(得分:7)

如果有人像我这样来这篇帖子,并且想知道如何将csv文件直接保存到models.FileField中,我建议采用这种方式:

import csv
from io import StringIO
from django.core.files.base import ContentFile

row = ["Name", "Location", "Price"]

csv_buffer = StringIO()
csv_writer = csv.writer(csv_buffer)
csv_writer.writerow(row)

csv_file = ContentFile(csv_buffer.getvalue().encode('utf-8'))

bill.bill.save('output.csv', csv_file)

答案 1 :(得分:-3)

删除实例不会删除关联的文件。您可以考虑使用signals来准确pre_delete。您可以编写一个接收器,您可以在其中删除相关文件。

from django.dispatch import receiver
from django.db.models.signals import pre_delete 

@receiver(pre_delete)
def func_name(sender, instance, **kwargs):
    your logic

您可以找到文档here