为django-import-export添加外键小部件

10 投票
3 回答
17882 浏览
提问于 2025-04-19 20:47

我正在尝试将数据导入到我的一个模型中,但失败了,因为我试图上传的是外键的ID,而不是导入导出时生成的序号。

这是我的models.py文件

from django.db import models
from import_export import resources


class School(models.Model):
    name = models.CharField(max_length=100)
    slug = models.CharField(max_length=100)
    school_id = models.IntegerField(unique=True)

class Sol(models.Model):
    school_id = models.ForeignKey(School, to_field='school_id')
    name = models.CharField(max_length = 100)
    Al1EOC = models.DecimalField(max_digits=5, decimal_places=2)
    AL2EOC = models.DecimalField(max_digits=5, decimal_places=2)

#Class for django-import-export
class SolResource(resources.ModelResource):
    class Meta:
        model = Sol

这是我的admin.py文件

from import_export.admin import ImportExportModelAdmin


class SolAdmin(ImportExportModelAdmin):
    list_display = ('name', 'school_id')
    resources_class = SolResource
    pass

admin.site.register(Sol, SolAdmin)

这是我的数据文件data.csv

id, name, school_id, Al1EOC, AL2EOC
,'Main st school', 1238008, 12.9, 14.9

当我从SOL模型导出数据时,得到的是学校ID的序号。我想要的是实际的学校ID,也就是那个与外键关系相关的ID。接下来,我需要用这个外键的数字来上传数据。我知道使用ForeignKey小部件可以做到这一点,但我不太明白它是怎么实现的。

3 个回答

3

使用这个小工具,效果很好。

school_id = fields.Field(column_name='school_id', attribute='Sol', widget=widgets.ForeignKeyWidget(Sol, 'school_id'))

4

我觉得这会有帮助:

class SolResource(resources.ModelResource):
    school_id = fields.Field()

    class Meta:
        # ...

    def dehydrate_school_id(self, sol):
        return sol.school_id.school_id # You can get all fields of related model. This is example.
10

文档中有一个叫做 ForeignKeyWidget 的东西。你可以在这里使用它。还有 IntegerWidget 和 DecimalWidget 这两个工具。

from import_export.admin import ImportExportModelAdmin

class SolResource(resources.ModelResource):
    school_id = fields.Field(
        column_name='school_id',
        attribute='school_id',
        widget=ForeignKeyWidget(School, 'name'))

    class Meta:
        model = Sol

class SolAdmin(ImportExportModelAdmin):
    list_display = ('name', 'school_id')
    resources_class = SolResource

admin.site.register(Sol, SolAdmin)

这是一个可以运行的例子。希望对你有帮助。

撰写回答