关于在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;或类似的东西?
随着帮助将不胜感激。我确信有一个简单的解决方案。
谢谢,
答案 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)