2014-09-04 160 views
6

我试图将数据导入到我的模型之一,但它失败,因为我试图上传外键id,而不是导入导出创建的迭代数字。将foreignKey小部件添加到django-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 

我的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 - 持有ForeignKey关系的学校ID。随后,我需要使用该外键号码上传数据。我知道ForeignKey小部件是实现它的方式,但我不明白它是如何实现的。

+0

您可以发布您在导入过程中收到的错误消息吗? – 2014-10-10 00:30:19

回答

3

我认为这将有助于:

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'))

3

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

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

+0

你能解释一下这个例子吗? – 2017-07-26 13:09:13

+0

Widget for ForeignKey字段,它在导出时使用“自然键”查找相关模型。 查找字段默认使用主键(pk)作为查找条件,但可以自定义以使用相关模型上的任何字段。在我的例子中,我使用school.name而不是school.pk。 – Jay 2017-07-26 13:15:41

+0

谢谢,我刚刚在班级的第一行'字段'上发生错误 – 2017-07-26 13:21:50

相关问题