通过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)