1

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

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

我的模型.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'])

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

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

关于编写实际记录(不是字段名称),我尝试了类似的方法,但显然我得到的输出不正确。

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

但正如您所期望的那样,这为每条记录中的每个字段值提供了单独的一行。是否有某种“write.writecell”或类似的东西?

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

谢谢,

4

1 回答 1

1

下面接受一个 Django 查询集并输出一个 CSV 文件。

用法::

从实用程序导入 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)
于 2013-08-06T14:29:39.243 回答