以 csv 格式下载包含来自多个模型的数据的 zip 文件

Posted

技术标签:

【中文标题】以 csv 格式下载包含来自多个模型的数据的 zip 文件【英文标题】:download zip file with data from multiple models in csv format 【发布时间】:2018-06-05 12:16:02 【问题描述】:

我正在使用Django 2.0

我必须从多个模型中下载 csv 格式的数据并压缩到一个 zip 文件中。

我正在使用django-import-export 插件为模型数据生成csv 文件

我正在做的是

def download_all_data(request):
    # user data
    user_resource = UserResource()
    queryset = User.objects.filter(username=request.user)
    data_set = user_resource.export(queryset)

    # favourite arbitrase
    favourite_arbitrase_resource = FavouriteArbitraseResource()
    favourite_arbitrase_queryset = FavouriteArbitrase.objects.filter(user=request.user)
    data_set_favourite_arbitrase = favourite_arbitrase_resource.export(favourite_arbitrase_queryset)

    response_user_data = HttpResponse(data_set.csv, content_type='text/csv')
    response_user_data['Content-Disposition'] = 'attachment; filename="user_data.csv"'

    response_favourite_arbitrase = HttpResponse(data_set_favourite_arbitrase.csv, content_type='text/csv')
    response_favourite_arbitrase['Content-Disposition'] = 'attachment; filename="favourite_arbitrase_data.csv"'

    zipped_file = io.BytesIO()
    with zipfile.ZipFile(zipped_file, 'w') as zip_file:
        zip_file.writestr('text/csv', response_user_data)
        zip_file.writestr('text/csv', response_favourite_arbitrase)

    zip_response = HttpResponse(zipped_file, content_type='application/octet-stream')
    zip_response['Content-Disposition'] = 'attachment; filename=my_file.zip'
    return zip_response

这是报错

object of type 'HttpResponse' has no len()

【问题讨论】:

【参考方案1】:

您需要将实际数据放入 zip,而不是捆绑的 HttpResponse

根据ZipFile.writestr docs,第一个参数是要用于数据的名称。

你可以这样:

zipped_file = io.BytesIO()
with zipfile.ZipFile(zipped_file, 'w') as zip_file:
    zip_file.writestr('user.csv', data_set.csv)
    zip_file.writestr('favourite.csv', data_set_favourite_arbitrase.csv)

【讨论】:

以上是关于以 csv 格式下载包含来自多个模型的数据的 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

NoSQL中的数据模型来自多个SQL表

如何从多个 .csv 文件中的命名列中选择唯一值?

如何将多个 CSV 数据集以适合 Keras 中的模型?

如何强制 Text::CSV 将数字存储为文本?

如何比较来自多个csv的数据

如何使用 Pandas 将多个 csv 文件中的单个数据列合并为一个?