Django 导入导出扩展用户

Django import export extended User

我正在尝试使用 Django import-export 在我的应用程序中导入数据。 即使有文档,我也无法使其适用于我的 "Proprietaire" 模型,它正在扩展 Django 的用户模型。这是我的模型:

class Proprietaire(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    adresse = models.CharField(max_length=500)
    telephone_regex = RegexValidator(
        regex="[0-9]{10}", message="Veuillez entrer un numéro de téléphone valide."
    )
    telephone = models.CharField(validators=[telephone_regex], max_length=10)
    date_inscription = models.DateField(auto_now_add=True)

用户导入似乎工作正常,但后来我不知道如何将我的 Proprietaire 和 link 导入到我的 User 中。阅读文档后,我在我的管理文件中尝试了这样的事情:

class ProprietaireResource(ModelResource):

    class Meta:
        model = Proprietaire
        fields = ('user__username','telephone','adresse')
        import_id_fields = ('user__username')


@admin.register(Proprietaire)
class ProprietaireAdmin(ImportExportModelAdmin):
    resource_class = ProprietaireResource

admin.site.unregister(User)

@admin.register(User)
class UserAdmin(ImportExportModelAdmin):
    pass

但是无论我尝试什么(没有 import_id_fields 或没有 fields,或者 adrresse 作为 import_id_fields),我总是收到这样的错误:

Traceback (most recent call last):
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 500, in import_row
instance, new = self.get_or_init_instance(instance_loader, row)
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 277, in get_or_init_instance
instance = self.get_instance(instance_loader, row)
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 265, in get_instance
import_id_fields = [
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 266, in <listcomp>
self.fields[f] for f in self.get_import_id_fields()
KeyError: 'a'

我不明白这里发生了什么。

有关信息,我正在尝试使用相同的文件导入 UserProprietaire(我认为这应该不是问题);这是我要导入的行的示例:

Headers : id,first_name,last_name,user__username,用户名,邮箱,is_active,地址,电话 线路:,Clémentine,PerreautBis,clementine.perreautbis,clementine.perreautbis,example@test.fr,0,25 rue du Paradis 69003 Lyon,0203040506

import_id_fields = ('user__username')

中的用户名后添加“,”

而不是

import_id_fields = ('user__username')

尝试

import_id_fields = ('user__username', )

('user__username') 不是一个可迭代对象,而是一个字符串。但是,如果您添加一个逗号,它将是一个元组,因此是一个可迭代的。

我的第一个建议是将 UserProprietaire 拆分成单独的文件,然后先导入 User 并在 Proprietaire 中导入 link使用 ForeignKeyWidget。你确实说过有一个用户导入,所以你可能已经在这样做了。这将是使用框架的标准方式,而且应该相当简单。

如果你不能这样做,并且需要在同一个 csv 文件中同时包含 UserProprietaire,那么我认为你将不得不创建一个子 class Resource 并覆盖 save_instance() 方法来处理提取用户字段并在保存 Proprietaire 模型实例之前创建/更新。

我终于解决了我的问题。 因为将所有内容保存在一个文件中对我来说很重要(最终用户应该填写导入文件,我想对他们来说尽可能简单)而且我认为这不是问题所在,我看了一下向上小部件部分只是为了看看它是否会有所作为。 它做到了!阅读以下文档后:https://django-import-export.readthedocs.io/en/latest/api_widgets.html,我的代码如下所示:

class ProprietaireResource(ModelResource):
    user = Field(column_name='user', attribute='user', widget=ForeignKeyWidget(User, 'username'))
    class Meta:
        model = Proprietaire
        fields = ('id','user','adresse','telephone')

我将我的专栏 "user__username" 重命名为 "user",一切都按预期进行:) 感谢您对 ForeignKeyWidget 的建议。