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'
我不明白这里发生了什么。
有关信息,我正在尝试使用相同的文件导入 User
和 Proprietaire
(我认为这应该不是问题);这是我要导入的行的示例:
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') 不是一个可迭代对象,而是一个字符串。但是,如果您添加一个逗号,它将是一个元组,因此是一个可迭代的。
我的第一个建议是将 User
和 Proprietaire
拆分成单独的文件,然后先导入 User
并在 Proprietaire
中导入 link使用 ForeignKeyWidget。你确实说过有一个用户导入,所以你可能已经在这样做了。这将是使用框架的标准方式,而且应该相当简单。
如果你不能这样做,并且需要在同一个 csv 文件中同时包含 User
和 Proprietaire
,那么我认为你将不得不创建一个子 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 的建议。
我正在尝试使用 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'
我不明白这里发生了什么。
有关信息,我正在尝试使用相同的文件导入 User
和 Proprietaire
(我认为这应该不是问题);这是我要导入的行的示例:
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') 不是一个可迭代对象,而是一个字符串。但是,如果您添加一个逗号,它将是一个元组,因此是一个可迭代的。
我的第一个建议是将 User
和 Proprietaire
拆分成单独的文件,然后先导入 User
并在 Proprietaire
中导入 link使用 ForeignKeyWidget。你确实说过有一个用户导入,所以你可能已经在这样做了。这将是使用框架的标准方式,而且应该相当简单。
如果你不能这样做,并且需要在同一个 csv 文件中同时包含 User
和 Proprietaire
,那么我认为你将不得不创建一个子 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 的建议。