Django csv导出
问题描述:
我有以下csv导出功能导出csv文件中的模型信息。但我试图弄清楚如何显示模型中函数的输出。因此,CSV导出功能显示模型中的所有字段从模型中的功能(表中的字段),但不输出..Django 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被输出?谢谢!
答
我想编辑的位,你遍历查询集,只是增加它的结束 -
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"))
UPDATE
获取字段和方法会有点困难,因为您会发现模型中有许多方法没有定义(并且您可能没有定义)蚂蚁在你的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)
我当然不能看到这样做(或事实上反正)的一种优雅的方式 - 我认为你将不得不以实际指定每种方法。
嘎!打败我一拳:) – Brandon 2013-02-22 19:28:16
@布兰登 - 我是否在分阶段发挥脏张贴? ;) – 2013-02-22 19:33:32
哈哈。一点也不。最近我刚刚遇到Stack Overflow横行。 – Brandon 2013-02-22 19:34:57