2012-01-05 70 views
0

嗨我正在编写生成csv文件的Django视图。非常简单。在我看来,我有:Django动态字段输出为CSV

def mysearch(request, exportCSV): 
    ... 
    if 'q' in request.GET or exportCSV: 
     results_list = request.session['results_list'] 
    ... 
    if exportCSV: 
     response = HttpResponse(mimetype='text/csv') 
     response['Content-Disposition'] = 'attachment; filename=myfile.csv' 
     writer = csv.writer(response) 

     # write field titles     
     writer.writerow(['name_of_firstfield', 'name_of_secondfield', ... ,]) 

     for row in results_list: 
      # write row content 
      writer.writerow([row.firstfield, row.secondfield, ... , ]) 
     return response  

这里包括两个问题:

  1. 我如何作为文本输出的模型字段的名称,所以我可以写字段标题到第一行。

  2. 如何避免为两行指定每个字段(考虑到我有很多字段)。我基本上要说每行,输出每个字段的名称,然后输出每一块数据。

我能以某种方式在这里使用getattr吗?

回答

2

看一看这个snippet作为一个例子,你可以通过model._meta.fields访问模型字段名,你可以使用getattr()得到一个字段的值给定对象。例如

fields = ct_object._meta.fields 

writer = csv.writer(response) 
writer.writerow([field.column for field in fields]) 

for object in objects_to_export: 
    writer.writerow([getattr(object, field.name) for field in fields]) 
+0

+1,除了最好使用'field.name'而不是列作为标题。 – 2012-01-05 16:53:57

+0

很好的答案。但是,我的查询非常复杂,涉及多个连接,所以我认为我坚持在流程的某个时间点列出所需的字段。 – 2012-01-06 00:42:44