【问题标题】:Django import / export: ForeignKey fields return NoneDjango 导入/导出:ForeignKey 字段返回无
【发布时间】:2017-07-19 12:34:13
【问题描述】:

使用 Django Import/Export,我在将外键字段导入我的 Django 模型时遇到问题。具体来说,我的模型中有三个要导入的字段(第四个——参与者——有一个默认值,所以我们可以忽略那个),其中一个是IntegerField,另外两个是ForeignKey字段。

所有三个字段在导入前都转换为数字格式。但是ForeignKey字段无法读取这些值,而是导入NaN(大概是因为我已经将这些模型字段设置为null=True

我在类似问题上尝试了多种解决方案,但都没有解决这个问题。

我在这里做错了什么?

models.py

class User(auth.models.User,auth.models.PermissionsMixin):
    def __str__(self):
        return "@{}".format(self.username)

class Forskningsresultater(models.Model):
    id = models.IntegerField(primary_key=True)
    authors = models.ManyToManyField(settings.AUTH_USER_MODEL, through='PersonRes', blank=True,related_name='authors',verbose_name="Authors")
    ... (plus irrelevant fields for this question)

class PersonRes(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,verbose_name="user")
    forskningsresultater = models.ForeignKey(Forskningsresultater,on_delete=models.CASCADE, null=True,verbose_name="forskningsresultater")
    participant = models.BooleanField(default=True)
    def __str__(self):
        return "{}. Result {}: {}".format(self.id,self.forskningsresultater, self.user)

admin.py

from import_export import widgets, fields, resources
class PersonResResource(resources.ModelResource):
    user = fields.Field(column_name='user_id', attribute='user', widget=widgets.ForeignKeyWidget(settings.AUTH_USER_MODEL, 'id'))
    forskningsresultater = fields.Field(column_name='forskningsresultater_id', attribute='forskningsresultater', widget=widgets.ForeignKeyWidget(Forskningsresultater, 'id'))
    class Meta:
        model = PersonRes
        fields = ('id','user','forskningsresultater','participant',)

from import_export.admin import ImportExportModelAdmin
class PersonResAdmin(ImportExportModelAdmin):
    class Meta:
        resource_class: PersonResResource
admin.site.register(PersonRes,PersonResAdmin)

myscript.py

...

df_persres[['A']] = df_persres[['A']].apply(pd.to_numeric)
df_persres[['B']] = df_persres[['B']].apply(pd.to_numeric)
df_persres[['C']] = df_persres[['C']].apply(pd.to_numeric)

df_persres.columns =['id','user_id','forskningsresultater_id']

if( len(df_persres.index) != 0):
    import tablib
    from import_export import resources
    from accounts.models import PersonRes
    personres_resource = resources.modelresource_factory(model=PersonRes)()
    antall = len(df_persres.index)
    for row in range(antall):
        dataset = tablib.Dataset([  df_persres.iat[row,0],
                                    df_persres.iat[row,1],
                                    df_persres.iat[row,2]],
                                    headers=['id', 'user_id', 'forskningsresultater_id'])
        result = personres_resource.import_data(dataset, dry_run=True)
else:
    pass

打印dataset 时,我得到以下信息(仅显示dataset 的一个实例):

id       |user_id|forskningsresultater_id
---------|-------|-----------------------
148097456|1480974|56

但是,当我使用pd.DataFrame.from_records(PersonRes.objects.all().values()) 打印模型时,我得到:

      forskningsresultater_id           id  participant  user_id
0                         NaN       338884         True      NaN
1                         NaN       566233         True      NaN
2                         NaN       636223         True      NaN

3                         NaN       754756         True      NaN
4                         NaN       802856         True      NaN
5                         NaN      1005256         True      NaN
...

【问题讨论】:

    标签: python django django-import-export


    【解决方案1】:

    列名应该如下(去掉_id):

    user = fields.Field(column_name='user', attribute='user', widget=widgets.ForeignKeyWidget(settings.AUTH_USER_MODEL, 'id'))
    forskningsresultater = fields.Field(column_name='forskningsresultater', attribute='forskningsresultater', widget=widgets.ForeignKeyWidget(Forskningsresultater, 'id'))
    

    【讨论】:

    • 我已经试过了。为了以防万一,我又做了一次,但它仍然在两个 ForeignKey 字段上都返回 None。您对我的代码可能有什么问题有其他建议吗?
    • 您是否已经填充了 Forskningsresultater 和用户字段以及 ID,并且您只是在 PersonRes 中导入现有对象的连接?
    • 您确定您的列标题在您的文件中也是 user 和 forskningsresultater 吗?您也将标题设置为 _id
    • 你说得对,乔纳森。我删除了所有的“_id”,它起作用了。它之前没有工作的原因是因为我的代码中有一个错字,我没有在我的问题中发布。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多