2013-02-22 5 views
1

J'ai la fonction d'exportation csv suivante pour exporter les informations de modèle dans le fichier csv. Mais j'essaie de comprendre comment afficher les résultats des fonctions du modèle. Ainsi, la fonction d'exportation csv montre tous les champs du modèle (champs de la table), mais pas les sorties de fonctions dans le modèle ..Django export csv

Donc, si je donne les résultats suivants:

def avg_tag(self, obj): 
    bids = Bid.objects.active(user=obj.user.id) 
    return bids.aggregate(average_price=Avg('list_price'))['average_price'] 

dans le modèle

Il n'obtient pas la sortie de cette fonction.

Voici l'action de la fonction d'exportation 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 

Comment puis-je changer la fonction ci-dessus afin que les sorties des fonctions du modèle sont émises dans le csv? Merci!

Répondre

1

je suppose modifier le bit où vous en boucle à travers le queryset et ajoutez juste sur la fin -

for obj in queryset: 
    writer.writerow([unicode(getattr(obj, field)).encode('utf-8') 
     for field in field_names] + "," + obj.avg_tag()) 

Vous pouvez faire quelque chose de similaire pour ajouter la rubrique que vous voulez -

if header: 
    if labels: 
     writer.writerow(labels + "," + "Average Tag") 
    else: 
     writer.writerow(field_names + "," + "Average Tag")) 

MISE À JOUR Il va être un peu difficile d'obtenir des champs et des méthodes parce que vous trouverez qu'il y a beaucoup de méthodes sur votre modèle que vous n'avez pas définies (et vous ne le faites probablement pas). fourmi dans votre csv). Il n'y a pas de moyen facile de différencier ce que vous voulez et ce que vous ne voulez pas.

avoir un jeu avec ce qui suit pour voir ce qui est là-dedans -

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) 

Je vois ne peux certainement pas une façon élégante de le faire (ou en fait de toute façon) - Je pense que vous allez avoir pour spécifier réellement chaque méthode.

+0

Gah! Battez-moi au coup de poing :) – Brandon

+0

@Brandon - est-ce que je joue un sale post par étapes? ;) –

+0

Haha. Pas du tout. Je viens d'être sur un saccage de débordement de pile de la fin. – Brandon