django-import-export 中的ForeignKeyWidget 显示 ID 而不是自定义列值

问题描述 投票:0回答:1

我正在使用 django-import-export 库来处理 Django 应用程序中的数据导入和导出。我有几个具有外键关系的模型,我想在导入/导出文件中显示和使用自定义列值而不是 ID。

# 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的ID。

python django django-import-export
1个回答
0
投票

在我看来,这部分声明是正确的:

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
,看看是否有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.