2016-08-18 1 views
1

Mon modèle:Comment exporter des valeurs de propriété avec django-import-export

class TreeNode(MPTTModel): 
    ... 
    @property 
    def pay_progress(self): 
     return "{}/{}".format(self.annuities.exclude(fact_date=None).aggregate(Sum('total'))['total__sum'] or 0, 
          self.annuities.aggregate(Sum('total'))['total__sum']) 

Ressources:

from import_export import resources 
from models import TreeNode 


class TreeNodeResource(resources.ModelResource): 
    class Meta: 
     model = TreeNode 

Vue:

def export_treenode_csv(request): 
    treenode_resource = TreeNodeResource() 
    dataset = treenode_resource.export() 
    response = HttpResponse(dataset.xls, content_type='application/vnd.ms-excel') 
    response['Content-Disposition'] = 'attachment; filename="TreeNode.xls"' 

    return response 

Mais cette exportation de code que les champs stockés dans base de données. Comment ajouter la valeur de la propriété pay_progress au rapport exporté?

Répondre

2

Vous pouvez profiter de dehydrate_<fieldname> méthode:

class TreeNodeResource(resources.ModelResource): 
    pay_progress = fields.Field() 

    class Meta: 
     model = TreeNode 

    def dehydrate_pay_progress(self, node): 
     return node.pay_progress 

Je trouve un peu fastidieux; Si quelqu'un a une meilleure solution, n'hésitez pas à la poser.

Edit: vous pouvez utiliser le paramètre nommé attribute d'un Field pour obtenir un attribut d'objet/propriété sans utiliser déshydrater():

class TreeNodeResource(resources.ModelResource): 
    pay_progress = fields.Field(attribute='pay_progress') 

    class Meta: 
     model = TreeNode 

Il est également possible de follow relationships à l'aide d'un double souligner.