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

Я просматривал следующую библиотеку - 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 - Джанго 1,11

1 Ответ

0 голосов
/ 19 декабря 2018

Я предполагаю, что ваш 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

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

...