質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

6549閲覧

django-import-exportを用いて、ForeignKeyを含むデータをインポートしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/05/23 21:45

前提・実現したいこと

  • DjangoでWebアプリを開発しています。
  • Excelのデータをインポートするため、django-import-exportを導入しました。
  • インポートしたいデータには、他のモデルのForeignKeyが含まれています。

下記のようなデータで、idは他のモデルのidです。
イメージ説明

  • 下記ドキュメントを読んだ上で、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

何かお気づきの方、ご教示頂ければ幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんな感じでいかがでしょうか?

class SaleResource(resources.ModelResource): site = Field(attribute='site', column_name='id', widget=ForeignKeyWidget(Site, 'id'))

こちらに例も出して説明しているので、参考にしてみてください。
Djangoでcsvをインポートするならdjango-import-exportが便利

投稿2021/01/21 05:42

naohide

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問