2013-07-02 35 views
1

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

由于我为最终用户创建了一种查询生成器,允许他们选择查询集中包含哪些字段,因此所选字段可能因查询而异,因此我无法到“硬编码”我的表标题等:

我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个阵列构建查询集,这个功能就通过我的request.POST。

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

比方说,例如,最终用户只是想选择字段“名字”和“姓氏”,我只是想生成CSV像下面

First Name Last Name 
John   Johnson 
Ted   Samson 

正如我所看到的从Django文档,你可以用下面的代码创建行

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

但是作为查询集被选择的字段可以从查询不同的查询,我需要一个动态WA这样做。我尝试了以下,但似乎没有工作。

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

在关于写作的实际记录(未字段名),我想这样的事情,但很明显,我得到的输出是不正确的。

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

但是,正如你所期望的,这给了我一个单独的行,为每个记录中的每个字段值。是否有某种'write.writecell'或其他类似的东西?

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

感谢,

+0

什么叫“似乎没有工作”是什么意思? – monkut

+0

它不打印任何东西。 – dlyxzen

回答

1

下面以一个Django的查询集和吐出的CSV文件。

用法::

从utils的导入dump2csv

从dummy_app.models导入*

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)