【问题标题】:Django import export extended UserDjango 导入导出扩展用户
【发布时间】:2020-04-19 18:43:33
【问题描述】:

我正在尝试使用 Django import-export 在我的应用程序中导入数据。 即使有文档,我也无法让它适用于我的“专有”模型,它正在扩展 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)

用户导入似乎工作正常,但我不知道如何导入我的Proprietaires 并将它们链接到我的Users。阅读文档后,我在我的管理文件中尝试了这样的事情:

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(我认为这应该不是问题);这是我尝试导入的一行示例:

标题:id,first_name,last_name,user__username,username,email,is_active,adresse,telephone Line : ,Clémentine,PerreautBis,clementine.perreautbis,clementine.perreautbis,example@test.fr,0,25 rue du Paradis 69003 Lyon,0203040506

【问题讨论】:

    标签: django django-users django-import-export


    【解决方案1】:

    import_id_fields = ('user__username')的用户名后添加“,”

    代替

    import_id_fields = ('user__username')
    

    试试

    import_id_fields = ('user__username', )
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答。我不明白为什么我应该拆分我的文件。我不想同时导入 User 和 Proprietaire。我第一次使用该文件来导入用户(仅获取用户的列并且工作正常),然后我想使用同一个文件来导入 Proprietaire,期望它只读取此模型的列。但无论如何,我不认为使用相同的文件会改变任何东西。如果我将它们分开,结果将与问题似乎是我对 ForeignKey 的使用相同。您是否使用 ForeignKeyWidget 来解决这个问题?
      • 根据您所说的,我认为拥有两个单独的文件是可行的方法,因为这样可以更轻松地管理流程。两个文件意味着两个模型,您可以适当地定义资源。这就是 ForeignKeyWidget 有帮助的地方,因为它引用了 Proprietaire 文件中的 User 实例。正如我在回答中建议的那样,在一个文件中完成所有操作将涉及覆盖和编写自定义代码。
      【解决方案3】:

      我终于解决了我的问题。 因为将它们全部保存在一个文件中对我来说很重要(最终用户应该填写导入文件,我想让它们尽可能简单)而且我认为这不是问题,所以我看了只是为了看看它是否会有所作为。 它做到了!阅读以下文档后: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 的建议。

      【讨论】:

        猜你喜欢
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 2015-06-10
        相关资源
        最近更新 更多