Django CSV导出
我有一个功能,可以把模型的信息导出成csv文件。但是我在想,怎么才能把模型中函数的输出也显示出来。现在这个csv导出功能只显示了模型中的所有字段(表格里的字段),却没有显示函数的输出。
比如说,我有以下内容:
def avg_tag(self, obj):
bids = Bid.objects.active(user=obj.user.id)
return bids.aggregate(average_price=Avg('list_price'))['average_price']
在模型里
但是它没有获取到那个函数的输出。
这是csv导出功能的代码:
def export_select_fields_csv_action(description="Export selected objects",
fields=None, exclude=None, header=True):
def export_as_csv(modeladmin, request, queryset):
"""
Generic csv export admin action.
based on http://djangosnippets.org/snippets/1697/
"""
opts = modeladmin.model._meta
field_names = [field.name for field in opts.fields]
labels = []
if exclude:
field_names = [v for v in field_names if v not in exclude]
elif fields:
field_names = [k for k, v in fields if k in field_names]
labels = [v for k, v in fields if k in field_names]
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = ('attachment; filename=%s.csv'
% unicode(opts).replace('.', '_'))
writer = csv.writer(response)
if header:
if labels:
writer.writerow(labels)
else:
writer.writerow(field_names)
for obj in queryset:
writer.writerow([unicode(getattr(obj, field)).encode('utf-8')
for field in field_names])
return response
export_as_csv.short_description = description
return export_as_csv
我该怎么修改上面的函数,让模型中函数的输出也能导出到csv里呢?谢谢!
1 个回答
1
我想你可以修改一下你循环遍历查询结果的那部分,把你想要的内容加到最后。
for obj in queryset:
writer.writerow([unicode(getattr(obj, field)).encode('utf-8')
for field in field_names] + "," + obj.avg_tag())
你可以用类似的方法来添加你想要的标题。
if header:
if labels:
writer.writerow(labels + "," + "Average Tag")
else:
writer.writerow(field_names + "," + "Average Tag"))
更新
获取字段和方法会有点困难,因为你会发现你的模型上有很多方法是你没有定义的(而且你可能不想把它们放进你的csv文件里)。没有简单的方法来区分你想要的和不想要的。
试着玩一下下面的内容,看看里面有什么。
import inspect
obj = modeladmin.model()
methods = [a for a in dir(modeladmin.model) if inspect.ismethod(getattr(obj, a))]
for method in methods:
print str(method)
我确实看不出有什么优雅的方法来做到这一点(实际上也没有什么方法)——我觉得你必须逐个指定每个方法。