インポートデータのワークフロー

このドキュメントでは、インポートプロセスのカスタマイズを可能にするフックで、インポートデータのワークフローを詳しく説明します。インポートプロセスの中心的な側面は、下記の説明にあるリソースの import_data() メソッドです。

import_data(dataset, dry_run=False, raise_errors=False)

Resourceimport_data() メソッドは、指定されたデータセットからデータをインポートすることを担当します。

dataset は必須であり、ヘッダー行を持つ tablib.Dataset であることが必要です。

dry_run はデータベースを変更するか、インポートをシュミレートするかどうかを判断するブール値です。デフォルトは False です。

raise_errors はブール値です。 True の場合、エラーが発生します。デフォルトは False です。これは最終的なエラーとトレースバックが Result インスタンスに保存されることを意味します。

これはメソッドが呼び出されたときに起こることです:

  1. 最初に、インポート中に収集されたエラーやその他の情報を保持する新しい InstanceLoader インスタンが初期化されます。

    次に、既存のインスタンスのロードを担当する InstanceLoader が初期化されます。ResourceOptionsinstance_loader_class 属性を使用して別の :class:~import_export.instance_loaders.BaseInstanceLoader` を指定できます。CachedInstanceLoader を使用すると、データベースクエリの数を減らすことが出来ます。利用可能な実装については、 source を参照して下さい。

  2. before_import() フックが呼び出されます。このメソッドをリソースに実装することで、インポートプロセスをカスタマイズ出来ます。

  3. インポート大勝のデータセットの各行は、次の手順に従って処理されます:

    1. before_import_row() フックはインポートする前に変更される行データを許可するために呼び出されます

    2. get_or_init_instance() は、現在の BaseInstanceLoader とデータセットの現在の行で呼び出され、オブジェクトが返され、オブフェクトが新しく作成されたかどうかのブール値が宣言されます。

      現在の行でオブジェクトが見つからない場合は、オブジェクトを初期化するために init_instance() が呼び出されます。

      いつものように、init_instance() 実装を上書きして、新しいオブジェクトの作成方法をカスタマイズすることが出来ます(つまり、デフォルト値の設定)。

    3. for_delete() は渡された instance を削除するかどうかを判断するために呼び出されます。この場合、現在の行のインポートプロセスはこの時点で停止します。

    4. 前の手順でインスタンスが削除されなかった場合、import_obj() は現在のオブジェクトとして instance を、現在の行として row を、そして dry run で呼ばれます。

      import_field() は、多対多のフィールドをスキップする Resource の各フィールドに対して呼び出されます。多対多のフィールドはインスタンスに主キーを持たせる必要があるためスキップされます。そしてオブジェクトがすでに保存されている時に代入が延期されます。

      attribute`() が設定され、Field.column_name` が指定された行に存在する場合、save() を呼び出します。

    5. 次いで、新たにインポートされたオブジェクトがすでに存在するオブジェクトと異なるか否か、したがって、与えられた行がスキップされるべきか否かが判定される。これは、元のオブジェクトとして original を使用し、データセットから現行オブジェクトとして instanceskip_row() を呼び出すことによって処理されます。

      現在の行をスキップする場合、row_result.import_typeIMPORT_TYPE_SKIP に設定されます。

    6. 現在の行をスキップしない場合は、 save_instance() が呼び出され、 dry_run` が設定されていない場合、実際にインスタンスが保存されます。

      インポートプロセスをカスタマイズするオプションを提供する2つのフックメソッド(デフォルトでは何もしません)があります:

      どちらのメソッドも、instance 引数と dry_run 引数を受け取ります。

    7. save_m2m() は、多くのフィールドを保存するために呼び出されます。

    8. RowResult には、元のフィールドとインポートされたオブジェクトフィールドの間のdiff、および行が新規か更新済みかスキップされたか削除されたかを示す import_type 属性が割り当てられます。

      行の処理中に例外が発生し、raise_errors=False (デフォルト)の import_data() が呼び出された場合、特定のトレースバックが RowResult にも追加されます。

      行がスキップされなかった場合、またはスキップされた行をレポートするように Resource が構成されている場合は、RowResultResult 追加されます

    9. after_import_row() フックは呼び出されます

  4. Result が返されます。

トランザクションサポート

トランザクションサポートが有効な場合、インポートプロセス全体がトランザクション内でラップされ、ロールバックまたはコミットされます。 import_data (create / delete / update)の内部から呼び出されたすべてのメソッドは、dry_run 引数に対して False を受け取ります。