2013-02-22 137 views
1

我有以下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被輸出?謝謝!

回答

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")) 

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) 

我當然不能看到這樣做(或事實上反正)的一種優雅的方式 - 我認爲你將不得不以實際指定每種方法。

+0

嘎!打敗我一拳:) – Brandon 2013-02-22 19:28:16

+0

@布蘭登 - 我是否在分階段發揮髒張貼? ;) – 2013-02-22 19:33:32

+0

哈哈。一點也不。最近我剛剛遇到Stack Overflow橫行。 – Brandon 2013-02-22 19:34:57