使用django import_export导入没有id字段作为主键的模型

mzillmmw  于 2023-05-30  发布在  Go
关注(0)|答案(2)|浏览(277)

我刚刚尝试了django-import-export来从csv文件导入一些东西。跟随文档,但在尝试导入以下模型时总是出错:

class Token(models.Model):
    key = models.CharField(db_index=True,unique=True,primary_key=True,    )
    pool = models.ForeignKey(Pool, on_delete=models.CASCADE)
    state = models.PositiveSmallIntegerField(default=State.VALID, choices=State.choices)

然后是资源类:

class TokenResource(resources.ModelResource):
class Meta:
    model = Token
    skip_unchanged = True
    report_skipped = True
    fields = "key"

现在,当导入csv文件时,我得到以下错误:

Error

row number: 1 - 'id'

Traceback (most recent call last):
File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 667, in import_row
instance, new = self.get_or_init_instance(instance_loader, row)
File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 359, in get_or_init_instance
instance = self.get_instance(instance_loader, row)
File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 346, in get_instance
import_id_fields = [
File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 347, in <listcomp>
self.fields[f] for f in self.get_import_id_fields()
KeyError: 'id'

在我的模型中没有字段ID,主键字段是键,那么为什么它不被采用?
或者是模型必须有一个id字段才能被导入?我知道这个id是用于比较等,但模型中有一个主键字段,所以我不明白为什么不采取这种方式。
我怎样才能在不重命名我的模型的情况下改变它呢?我在文档中找不到任何提示。
谢谢

os8fio9y

os8fio9y1#

在我的模型中没有字段ID,主键字段是键,那么为什么它不被采用?
用于标识对象是否存在的默认字段称为“id”。但是,您可以使用import_id_fields进行覆盖,因此在您的情况下,以下内容应该可以工作:

class TokenResource(resources.ModelResource):
    class Meta:
        model = Token
        skip_unchanged = True
        report_skipped = True
        import_id_fields = ("key",)

        # you can optionally use 'fields' as a whitelist for 
        # fields to be imported
        fields = ("key",)
a5g8bdjr

a5g8bdjr2#

确保使用import_id_fields=("your_model_primary_key")设置资源的类 meta:

from import_export import resources
from import_export.admin import ImportExportModelAdmin

class TokenResource(resources.ModelResource):
    class Meta:
        model = Token
        import_id_fields = ("your_model_primary_key",)

对于django-import-export 2.9.0以上的版本,resource_class已经被弃用,而支持resource_classes,它应该被声明为列表或元组

class TokenAdmin(ImportExportModelAdmin):
    resource_classes = [TokenResource]
    # rest of the code

相关问题