通过Django View生成CSV

时间:2013-07-02 00:48:58

标签: python django excel 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)

让我们举例来说,最终用户只想选择字段' firstname'和'姓氏',我只想生成如下的

First Name    Last Name
John          Johnson
Ted           Samson

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

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

然而,由于在查询集中选择的字段可能因查询而异,我需要一种动态的方法来执行此操作。我尝试了以下方法,但似乎没有用。

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

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

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

但正如您所料,这为每条记录中的每个字段值提供了一个单独的行。是否存在某种类型的write.writecell&#39;或类似的东西?

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

谢谢,

1 个答案:

答案 0 :(得分:1)

以下内容包含Django查询集并吐出CSV文件。

用法::

  
    

来自utils import dump2csv

         

来自dummy_app.models import *

         

qs = DummyModel.objects.all()

         

dump2csv.dump(qs,'。/ data / dumpcsv')

  

剧本:

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)