【问题标题】:Adding foreignKey widget to django-import-export将 foreignKey 小部件添加到 django-import-export
【发布时间】:2014-09-04 16:25:14
【问题描述】:

我正在尝试将数据导入我的一个模型,但它失败了,因为我正在尝试上传 foreignKey Id,而不是 import-export 创建的迭代数字。

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

我的管理员.py

from import_export.admin import ImportExportModelAdmin


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

admin.site.register(Sol, SolAdmin)

我的数据.csv

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

当我从 SOL 模型中导出数据时,我会得到一个学校 ID 的迭代编号。我想要实际的学校 ID - 持有 foreignKey 关系的那个。并且,随后,我需要使用该外键号上传数据。我知道 ForeignKey 小部件是这样做的方法,但我不明白它是如何实现的。

【问题讨论】:

    标签: python django django-import-export


    【解决方案1】:

    文档中有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)
    

    这是一个工作示例。希望它会有所帮助。

    【讨论】:

    • 你能解释一下这个例子的作用吗?
    • ForeignKey 字段的小部件,它在导出和导入中都使用“自然键”查找相关模型。查找字段默认使用主键 (pk) 作为查找条件,但可以自定义为使用相关模型上的任何字段。在我的示例中,我使用了 school.name 而不是 school.pk 。
    • 谢谢,我只是在课堂第一行的“字段”上遇到错误
    • @JayModi 你能帮我理解'school_id' 在你建议的代码school_id = fields.Field( column_name='school_id', attribute='school_id', widget=ForeignKeyWidget(School, 'name'))中用 column_name 代表什么@
    【解决方案2】:

    我认为这会有所帮助:

    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.
    

    【讨论】:

      【解决方案3】:

      使用小部件 - 效果很好。

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

      【讨论】:

        猜你喜欢
        • 2017-07-07
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        • 2013-10-30
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多