通过Django视图生成CSV

关于在Django视图中生成CSV文件已经有几个线程,但没有一个真正适合我的情况(并为我工作)。

由于我为最终用户创build了一种查询生成器,允许他们select包含在查询集中的字段,所以被选中的字段可能因查询而异,因此我无法“代码“我的表格标题等:

我的Models.py

class Customers(models.Model): firstname = models.CharField(max_length=100) middlename = models.CharField(max_length=100) lastname = models.CharField(max_length=100) nickname = models.CharField(max_length=100) 

基本上我有1个字典和2个数组构build查询集,这通过我的request.POST进来。

 customers = Customers.objects.all().filter(**filargs).order_by(*ordargs).values(*selargs) 

比方说,最终用户只想select字段的名字和姓氏,我只是想生成一个CSV如下

 First Name Last Name John Johnson Ted Samson 

正如我从Django文档中看到的那样,您可以使用以下代码创build行

 writer.writerow(['First Name','Last Name']) 

但是,由于在queryset中select的字段可能与查询不同,所以我需要一个dynamic的方法来做到这一点。 我尝试了以下,但似乎没有工作。

 writer.writerow(selargs) << selargs being my select field list 

关于写实际logging(而不是字段名称),我尝试了这样的事情,但显然我得到的输出是不正确的。

 for customer in customers: for value in customer: writer.writerow(value) 

但是,正如你所期望的,这给了我每个logging中的每个字段值单独的行。 是否有某种“write.writecell”或类似的东西?

作为帮助将不胜感激。 我确定有一个简单的解决scheme。

谢谢,

以下内容接受一个Django查询集并吐出一个CSV文件。

用法::

从utils导入dump2csv

from dummy_app.models import *

qs = DummyModel.objects.all()

dump2csv.dump(qs,'./data/dump.csv')

剧本:

 import csv from django.db.models.loading import get_model def dump(qs, outfile_path): model = qs.model writer = csv.writer(open(outfile_path, 'w')) headers = [] for field in model._meta.fields: headers.append(field.name) writer.writerow(headers) for obj in qs: row = [] for field in headers: val = getattr(obj, field) if callable(val): val = val() if type(val) == unicode: val = val.encode("utf-8") row.append(val) writer.writerow(row)