前提・実現したいこと
- DjangoでWebアプリを開発しています。
- Excelのデータをインポートするため、django-import-exportを導入しました。
- インポートしたいデータには、他のモデルのForeignKeyが含まれています。
- 下記ドキュメントを読んだ上で、ForeignKeyとなるモデルと実際にインポートに使うフィールドを「__」で繋げば、そのフィールドだけを用いてインポートできるのかと思い、後述のように実装してみました。
https://kurozumi.github.io/django-import-export/getting_started.html
ModelResource フィールドを定義する時、モデルの関連に従うことが可能です:
class BookResource(resources.ModelResource):
class Meta:
model = Book
fields = ('author__name',)
発生している問題・エラーメッセージ
実際にExcelをインポートしようとすると、下記のようなエラーが出ます。
Errors Line number: 1 - 'id' 18162, 2018-10-01 00:00:00, 30240 Traceback (most recent call last): File "C:\Users\myname\PycharmProjects\cost_transfer\venv\lib\site-packages\import_export\resources.py", line 522, in import_row instance, new = self.get_or_init_instance(instance_loader, row) File "C:\Users\myname\PycharmProjects\cost_transfer\venv\lib\site-packages\import_export\resources.py", line 292, in get_or_init_instance instance = self.get_instance(instance_loader, row) File "C:\Users\myname\PycharmProjects\cost_transfer\venv\lib\site-packages\import_export\resources.py", line 281, in get_instance self.fields[f] for f in self.get_import_id_fields() File "C:\Users\myname\PycharmProjects\cost_transfer\venv\lib\site-packages\import_export\resources.py", line 281, in <listcomp> self.fields[f] for f in self.get_import_id_fields() KeyError: 'id'
該当のソースコード
下記のSaleというモデルについて、エクセルデータからインポートしたいです。
python
1# models.py 2class Site(models.Model): 3 id = models.IntegerField(primary_key=True, unique=True, verbose_name='工事番号') 4 name = models.CharField(max_length=50, verbose_name='工事名') 5 complete_date = models.DateField(verbose_name='完成日', null=True, blank=True) 6 7 def __str__(self): 8 return str(self.id) + ' ' + self.name 9 10 11class Sale(models.Model): 12 site = models.ForeignKey(Site, on_delete=models.CASCADE) # ForeignKeyを含んでいます 13 date = models.DateField(verbose_name='日付') 14 amount = models.IntegerField(default=0, verbose_name='金額') 15 16 def __str__(self): 17 return str(self.site.id) + ' ' + self.site.name
python
1# admin.py 2class SaleResource(resources.ModelResource): 3 4 class Meta: 5 model = Sale 6 fields = ('site__id', 'date', 'amount') # 上記のドキュメントを参考にして、siteとidを「__」で繋ぎました。 7 8 9 10class SaleAdmin(ImportExportModelAdmin): 11 list_display = fields = ('date', 'site', 'amount') 12 resource_class = SaleResource 13 14admin.site.register(Sale, SaleAdmin) 15
補足情報(FW/ツールのバージョンなど)
- python 3.7
- Django 3.0.6
- django-import-export 2.1.0
何かお気づきの方、ご教示頂ければ幸いです。
よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。