Как экспортировать значения свойств с помощью 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'])

Ресурсы:

from import_export import resources
from models import TreeNode


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

Посмотреть:

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

Но этот код экспортирует только поля, хранящиеся в базе данных. Как добавить pay_progress значение свойства для экспортируемого отчета?

1 ответ

Решение

Вы можете воспользоваться методом dehydrate_;:

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

    class Meta:
        model = TreeNode

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

Я нахожу это немного утомительным; если у кого-то есть лучшее решение, не стесняйтесь его отстаивать.

Изменить: вы можете использовать названный параметр attribute из Field чтобы получить атрибут / свойство объекта без использования dehydrate ():

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

    class Meta:
        model = TreeNode

Также возможно следовать отношениям, используя двойное подчеркивание.

Другие вопросы по тегам