файл импорта, в котором имена столбцов отличаются от имен в модели, вызвал строки с пустой строкой

#django #django-import-export

Вопрос:

Я хотел бы использовать пакет django-импорт-экспорт для импорта некоторых файлов TSV, но у меня возникли некоторые проблемы.

В файле у меня есть имена столбцов в верхнем регистре, такие как: INDUSTRYGROUPTYPE, TOTALOFFERINGAMOUNT, TOTALREMAINING

В модели у меня то же имя, но в нижнем регистре и ниже, вот так:

 class Offering(models.Model):
    industry_group_type = models.CharField(max_length=260)
    total_offering_amount = models.CharField(max_length=17)
    total_remaining = models.CharField(max_length=17)
 

Класс ресурсов выглядит следующим образом:

 class OfferingResource(ModelResource):
    industry_group_type = Field(attribute='INDUSTRYGROUPTYPE')
    total_offering_amount = Field(attribute='TOTALOFFERINGAMOUNT')
    total_remaining = Field(attribute='TOTALREMAINING')

    class Meta:
        model = Offering
        fields = ('id', 'industry_group_type', 'total_offering_amount', 'total_remaining')
        
 

При импорте файла создаются пустые строки, содержащие только пустую строку '' , и в них нет данных.

Мне нужна помощь, чтобы исправить это, пожалуйста.

Ответ №1:

Я нашел решение, я должен использовать имена столбцов файла в качестве имени переменной атрибута класса, а не в качестве значения attribute аргумента Field класса.

Итак, класс ресурсов должен быть таким:

 class OfferingResource(ModelResource):
    INDUSTRYGROUPTYPE = Field(attribute='industry_group_type')
    TOTALOFFERINGAMOUNT = Field(attribute='total_offering_amount')
    TOTALREMAINING = Field(attribute='total_remaining')

    class Meta:
        model = Offering
        fields = ('id', 'INDUSTRYGROUPTYPE', 'TOTALOFFERINGAMOUNT', 'TOTALREMAINING')
 

Ответ №2:

Как вы сказали, объявление поля ресурса в соответствии с именем атрибута будет работать, но вы также можете использовать column_name параметр для объявления имени поля в tsv. Вы можете использовать «атрибут» для объявления соответствующего атрибута в объекте модели

 class OfferingResource(ModelResource):
    industry_group_type = Field(attribute='industry_group_type', column_name='INDUSTRYGROUPTYPE')
    total_offering_amount = Field(attribute='total_offering_amount', column_name='TOTALOFFERINGAMOUNT')
    total_remaining = Field(attribute='total_remaining', column_name='TOTALREMAINING')

    class Meta:
        model = Offering
        fields = ('id', 'industry_group_type', 'total_offering_amount', 'total_remaining')
 

Документы