Экспорт с использованием django-import-export и отображение подробных имен связанных объектов

Я смотрел на следующую библиотеку - django-import-export. Однако у меня возникли проблемы с экспортом с понятными / подробными именами столбцов для связанных объектов.

Ссылка по теме: https://github.com/django-import-export/django-import-export/issues/52

class HumanModelResource(resources.ModelResource):
def get_export_headers(self):
    headers = []
    for field in self.get_fields():
        model_fields = self.Meta.model._meta.get_fields()
        header = next((x.verbose_name for x in model_fields if x.name == field.column_name), field.column_name)
        headers.append(header)
    return headers

class Meta:
    model = Human
    fields = ("name", "pet__name")

class HumanAdmin(ExportMixin, admin.ModelAdmin):
    resource_class = HumanModelResource
    list_display = ("name", "pet")

class Human(models.Model):
    name = models.CharField(max_length=255, verbose_name="Name")
    pet = models.ForeignKey(Pet)

class Pet(models.Model):
    name = models.CharField(max_length=255, verbose_name="Pet Name")

При экспорте отобразится "Имя" для человека, но имя питомца будет отображаться как "имя питомца".

Я не уверен, как подходить к переопределению метода get_export_headers для отображения связанных объектов с подробным именем.

В настоящее время я использую: - Python 2.7 - Django 1.11

0 ответов

Я предполагаю, что ваш get_export_headers() терпит неудачу, потому что x.name == field.column_name совпадение не удается (x.name знак равно pet а также field.column_name знак равно pet__name).

Таким образом, вы можете исправить эту конкретную ошибку, но есть и другой способ, который больше соответствует API Django Import / Export: явно определите отношение внешнего ключа.

from import-export import resources, fields

class HumanModelResource(resources.ModelResource):

   petname = fields.Field(
       attribute="pet",
       column_name="Pet Name",
       widget=ForeignKeyWidget(Pet, "name")
   )

   class Meta:
       model = Human
       fields = ("name", "petname") # note the change

(Примечание: не проверено.)

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