2013-02-22 3 views
1

У меня есть следующая функция экспорта csv для экспорта информации о модели в файл csv. Но я пытаюсь понять, как показать результаты от функций в модели. Таким образом, функция CSV экспорт показывает все поля в модели (поля в таблице), но не выходы из функций в модели ..Django csv export

Так что, если у меня есть следующий:

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

Я предполагаю редактировать бит, где цикл через QuerySet и просто добавить его в конце -

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

Gah! Ударь меня на удар :) – Brandon

+0

@Brandon - Я играю грязную публикацию поэтапно? ;) –

+0

Ха-ха. Не за что. В последнее время я только что был в Stack Overflow rampage. – Brandon