モデルに初期データを投入する¶
アプリを最初にセットアップするとき、データベースに、ハードコーディングされたデータをあらかじめ入力しておくと便利なことがあります。マイグレーションまたはフィクスチャで初期データを提供できます。
マイグレーションで初期データを投入する¶
アプリの初期データを自動的にロードするには、 データマイグレーション を作成します。マイグレーションはテストデータベースのセットアップ時に実行されるため、 いくつかの条件 を満たすことで、データが利用できるようになります。
フィクスチャでデータを投入する¶
フィクスチャ (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
コマンドでそれらを区別できなくなります。この問題を避ける最も簡単な方法は、フィクスチャファイルを 名前空間 で区切ることです。つまり、上記の相対パスの例のように、アプリケーションに応じた名前のディレクトリにファイルを置くことです。
参考
フィクスチャは テストフレームワーク でも利用でき、テスト環境の一貫性を保つのに役立ちます。