モデルに初期データを投入する¶
It's sometimes useful to prepopulate your database with hardcoded data when you're first setting up an app. You can provide initial data with migrations or fixtures.
マイグレーションで初期データを投入する¶
アプリの初期データを自動的にロードするには、 データマイグレーション を作成します。マイグレーションはテストデータベースのセットアップ時に実行されるため、 いくつかの条件 を満たすことで、データが利用できるようになります。
フィクスチャでデータを投入する¶
フィクスチャ (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 コマンドでそれらを区別できなくなります。この問題を避ける最も簡単な方法は、フィクスチャファイルを 名前空間 で区切ることです。つまり、上記の相対パスの例のように、アプリケーションに応じた名前のディレクトリにファイルを置くことです。
参考
フィクスチャは テストフレームワーク でも利用でき、テスト環境の一貫性を保つのに役立ちます。