Cómo devolver múltiples archivos en HttpResponse Django

He estado destrozando mi cerebro en este problema. ¿Hay alguna manera en django de servir múltiples archivos desde una única HttpResponse?

Tengo un escenario en el que estoy haciendo un bucle a través de una lista de json y quiero devolver todo eso como archivo desde mi vista de administrador.

class CompanyAdmin(admin.ModelAdmin): form = CompanyAdminForm actions = ['export_company_setup'] def export_company_setup(self, request, queryset): update_count = 0 error_count = 0 company_json_list = [] response_file_list = [] for pb in queryset.all(): try: # get_company_json_data takes id and returns json for the company. company_json_list.append(get_company_json_data(pb.pk)) update_count += 1 except: error_count += 1 # TODO: Get multiple json files from here. for company in company_json_list: response = HttpResponse(json.dumps(company), content_type="application/json") response['Content-Disposition'] = 'attachment; filename=%s.json' % company['name'] return response #self.message_user(request,("%s company setup extracted and %s company setup extraction failed" % (update_count, error_count))) #return response 

Ahora esto solo me permitirá devolver / descargar un archivo json, ya que el retorno rompería el ciclo. ¿Hay una forma más sencilla de agregar todo esto en un solo objeto de respuesta y devolver ese bucle externo y descargar todo el json en la lista en varios archivos?

Busqué una forma de envolver todos estos archivos en un archivo zip, pero no pude hacerlo, ya que todos los ejemplos que pude encontrar tenían archivos con ruta y nombre que no tengo en este caso.

ACTUALIZAR:

Intenté integrar la solución de zartch para obtener un archivo zip utilizando lo siguiente:

  import StringIO, zipfile outfile = StringIO.StringIO() with zipfile.ZipFile(outfile, 'w') as zf: for company in company_json_list: zf.writestr("{}.json".format(company['name']), json.dumps(company)) response = HttpResponse(outfile.getvalue(), content_type="application/octet-stream") response['Content-Disposition'] = 'attachment; filename=%s.zip' % 'company_list' return response 

Para empezar, como nunca tuve los archivos, pensé en usar json dump y agregar un nombre de archivo individual. Esto crea un archivo zip vacío. Lo que creo que se espera, ya que estoy seguro de que zf.writestr("{}.json".format(company['name']), json.dumps(company)) no es la forma de hacerlo. Agradecería si alguien me puede ayudar con esto.

Quizás si intenta empaquetar todos los archivos en un archivo zip, puede archivar esto en Admin.

Algo como:

 def zipFiles(files): outfile = StringIO() # io.BytesIO() for python 3 with zipfile.ZipFile(outfile, 'w') as zf: for n, f in enumarate(files): zf.writestr("{}.csv".format(n), f.getvalue()) return outfile.getvalue() zipped_file = zip_files(myfiles) response = HttpResponse(zipped_file, content_type='application/octet-stream') response['Content-Disposition'] = 'attachment; filename=my_file.zip'