ForeignKeyWidget в django-import-export показывает ID вместо значения пользовательского столбца

Я использую библиотеку django-import-export для обработки импорта и экспорта данных в моем Django-приложении. У меня есть несколько моделей с отношениями ForeignKey, и я хочу отображать и использовать значения пользовательских колонок вместо идентификаторов в моих файлах импорта/экспорта.

# models.py

class YearCategoryMalnutrition(models.Model):
    id = models.AutoField(primary_key=True)
    year_recorded = models.CharField(max_length=4, default="")
    last_update = models.DateTimeField(auto_now=True, null=True)

    def __str__(self):
        return self.year_recorded


class AgeCategory(models.Model):
    AGE_CATEGORIES = (
        ('0-5 years old (0-60 months)', '0-5 years old (0-60 months)'),
        ('5.08-10.0 years old (61-120 months)', '5.08-10.0 years old (61-120 months)'),
        ('10.08-19.0 years old (121-228 months)', '10.08-19.0 years old (121-228 months)'),
        ('Adults 20 years old above', 'Adults 20 years old above'),
    )
    age_category_name = models.CharField(
        max_length=50,
        choices=AGE_CATEGORIES,
        default='0-5 years old (0-60 months)',
    )
    last_update = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        verbose_name_plural = "Age Categories"

    def __str__(self):
        return self.age_category_name


class LevelCategory(models.Model):
    LEVEL_CATEGORIES = (
        ('National Level', 'National Level'),
        ('Regional Level', 'Regional Level'),
        ('Province Level', 'Province Level'),
        ('Municipality Level', 'Municipality Level'),
        ('Barangay Level', 'Barangay Level'),
    )
    level_category_name = models.CharField(
        max_length=50,
        choices=LEVEL_CATEGORIES,
        default='National Level',
    )
    last_update = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        verbose_name_plural = "Level Categories"

    def __str__(self):
        return self.level_category_name


class NationalLevel(models.Model):
    id = models.AutoField(primary_key=True)
    country_name = models.CharField(max_length=255, default="Philippines")
    overweight = models.FloatField(default=0.0)
    underweight = models.FloatField(default=0.0)
    stunting = models.FloatField(default=0.0)
    wasting = models.FloatField(default=0.0)
    overweight_error = models.FloatField(default=0.0)
    underweight_error = models.FloatField(default=0.0)
    stunting_error = models.FloatField(default=0.0)
    wasting_error = models.FloatField(default=0.0)
    year_record = models.ForeignKey(YearCategoryMalnutrition, on_delete=models.PROTECT)
    age_category = models.ForeignKey(AgeCategory, on_delete=models.PROTECT, null=True)
    level_category = models.ForeignKey(LevelCategory, on_delete=models.PROTECT, null=True)
    last_update = models.DateTimeField(auto_now=True)
# resources.py

from import_export import resources, fields
from import_export.widgets import ForeignKeyWidget
from .models import NationalLevel, YearCategoryMalnutrition, AgeCategory, LevelCategory

class NationalLevelResource(resources.ModelResource):
    
    year_record = fields.Field(
        column_name='year_record',
        attribute='year_record',
        widget=ForeignKeyWidget(YearCategoryMalnutrition, 'year_recorded')
    )
    
    age_category = fields.Field(
        column_name='age_category',
        attribute='age_category',
        widget=ForeignKeyWidget(AgeCategory, 'age_category_name')
    )
    
    level_category = fields.Field(
        column_name='level_category',
        attribute='level_category',
        widget=ForeignKeyWidget(LevelCategory, 'level_category_name')
    )

    class Meta:
        model = NationalLevel
        fields = ('country_name', 'overweight', 'underweight', 'stunting',
                  'wasting', 'overweight_error', 'underweight_error', 'stunting_error',
                  'wasting_error', 'year_record__year_recorded', 'age_category', 'level_category', 'last_update')
        export_order = ('country_name', 'overweight', 'underweight', 'stunting',
                        'wasting', 'overweight_error', 'underweight_error', 'stunting_error',
                        'wasting_error', 'year_record', 'age_category', 'level_category', 'last_update')
# admin.py
from django.contrib import admin
from import_export.admin import ImportExportModelAdmin
from .models import NationalLevel
from .resources import NationalLevelResource

class NationalLevelAdmin(ImportExportModelAdmin):
    list_display = (
        'id', 
        'country_name',
        'overweight',
        'underweight',
        'stunting',
        'wasting',
        'overweight_error',
        'underweight_error',
        'stunting_error',
        'wasting_error',
        'year_record',
        'age_category',
        'level_category',
        'last_update',
    )
    ordering = ('year_record',)
    list_filter = ('year_record', 'age_category', 'level_category')
    search_fields = ('country_name',)
    list_per_page = 25
    resource_class = NationalLevelResource

При экспорте данных я хочу отображать значение вместо ID. Кроме того, при импорте данных я хочу принимать значение вместо идентификатора для записи year_record.

Этот раздел, как мне кажется, объявлен правильно:

class NationalLevelResource(resources.ModelResource):
    
    year_record = fields.Field(
        column_name='year_record',
        attribute='year_record',
        widget=ForeignKeyWidget(YearCategoryMalnutrition, 'year_recorded')
    )

Вы правильно определяете отношение FK и используете 'year_recorded' в качестве значения поиска. Предполагается, что year_recorded может однозначно идентифицировать запись FK (Docs).

Думаю, дело в том, что вы объявили year_record__year_recorded в списке fields. Попробуйте изменить его на year_record и посмотрите, поможет ли это.

Вернуться на верх