モデルに初期データを投入する

アプリを最初にセットアップするとき、データベースに、ハードコーディングされたデータをあらかじめ入力しておくと便利なことがあります。マイグレーションまたはフィクスチャで初期データを提供できます。

マイグレーションで初期データを投入する

アプリの初期データを自動的にロードするには、 データマイグレーション を作成します。マイグレーションはテストデータベースのセットアップ時に実行されるため、 いくつかの条件 を満たすことで、データが利用できるようになります。

フィクスチャでデータを投入する

フィクスチャ (fixture) を使ってデータを投入することもできますが、 TransactionTestCase.fixtures を使わない限り、このデータは自動的にはロードされません。

フィクスチャは、Djangoがデータベースにインポートする方法を知っているデータのコレクションです。 すでにいくつかのデータがある場合、フィクスチャを作成する最も簡単な方法は manage.py dumpdata コマンドを使用することです。 もしくは、フィクスチャを手動で書くこともできます; フィクスチャは JSON、XML、または (PyYAML をインストールして) YAML ドキュメントとして記述できます。 シリアライズのドキュメント でサポートされている各 シリアライズフォーマット の詳細を確認できます。

例として、 Person モデルのフィクスチャをJSONで書くと次のようになります:

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Paul",
      "last_name": "McCartney"
    }
  }
]

YAML のフィクスチャだと以下のようになります:

- model: myapp.person
  pk: 1
  fields:
    first_name: John
    last_name: Lennon
- model: myapp.person
  pk: 2
  fields:
    first_name: Paul
    last_name: McCartney

このデータは、アプリケーション内の fixtures ディレクトリ内に保存しておくことができます。

データを読み込むには、 manage.py loaddata <fixturename> を呼び出します。ここで <fixturename> は作成したフィクスチャファイルの名前です。 loaddata を実行するたびに、フィクスチャからデータが読み込まれ、データベースに再ロードされます。これは、フィクスチャによって作成された行の一つを変更してから loaddata を再度実行すると、変更が元に戻ってしまうことを意味します。

フィクスチャファイルを探す場所を Django に教える

デフォルトでは、Django は各アプリの fixtures ディレクトリにあるフィクスチャを探すので、 loaddata sample コマンドは my_app/fixtures/sample.json ファイルを探します。これは相対パスでも動作するので、 loaddata my_app/sample では my_app/fixtures/my_app/sample.json ファイルが見つかります。

Django は FIXTURE_DIRS 設定で指定されたディレクトリのリストからもフィクスチャを探します。

デフォルトの検索を完全に防ぐためには、フィクスチャファイルの場所の指定に絶対パスを使用してください。例えば、 loaddata /path/to/sample のようにします。

フィクスチャファイルの名前空間を指定する

Django は、名前が一致するフィクスチャファイルを最初に見つけると、そのフィクスチャ ファイルを使います。そのため、異なるアプリケーションに同じ名前のフィクスチャファイルがあると、 loaddata コマンドでそれらを区別できなくなります。この問題を避ける最も簡単な方法は、フィクスチャファイルを 名前空間 で区切ることです。つまり、上記の相対パスの例のように、アプリケーションに応じた名前のディレクトリにファイルを置くことです。

参考

フィクスチャは テストフレームワーク でも利用でき、テスト環境の一貫性を保つのに役立ちます。

Back to Top