【问题标题】:Django: generate a CSV file and store it into FileFieldDjango:生成一个 CSV 文件并将其存储到 FileField
【发布时间】:2017-08-02 15:36:03
【问题描述】:

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

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

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

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

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

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()

谢谢

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

bill = Bill()
bill.billId = 14
bill.bill.name = 'bills/output.csv'
bill.save()

【问题讨论】:

    标签: python django csv filefield


    【解决方案1】:

    如果有人像我一样看到这篇文章并且想知道如何将 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)
    
    

    【讨论】:

    • 我必须将.encode('utf-8') 添加到csv_buffer.getvalue() 否则我得到Unicode-objects must be encoded before hashing
    【解决方案2】:

    删除实例不会删除关联文件。您可以考虑使用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

    【讨论】:

    • 这不是答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多