Импорт модели без поля id в качестве первичного ключа с помощью django import_export
Только что попробовал 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, поле первичного ключа является ключевым, так почему оно не берется?
Поле по умолчанию для определения того, существует объект или нет, называется '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",)