2018/07/26
Django モデル データベースFixtureの使い方 初期データ追加を自動化しよう!
Djangoでは、便利なAdminページが用意されてますので、下の画像のように、「追加ボタン」からインスタンスを一つ一つ追加することができます。
開発中は、サンプルとなるインスタンスをいくつか作成することで、実際の挙動を確認することも多くなるでしょう。今日は、このインスタンス作成作業を自動化してくれるFixture
というものを紹介します。
Fixtureを作るメリット
・何かしらの理由でデータベースの中身を削除しても、Fixtureを作っておけば一発でデータ投入できる。
・コマンドさえ叩けば、共同開発者のローカル環境でも同じデータをすぐに作成できる。
Fixtureの使い方
Fixtureの使い方は簡単です。
-
アプリフォルダ内に、fixturesというフォルダを作成します。
-
fixturesフォルダ内に、JSON、XML、YAMLいずれかの形式のファイルを作成します。このファイルで、どんなデータを作成するのか定義します。
-
コマンドを打つことで、fixtureファイルで定義されたデータがデータベースに反映されます。
Fixtureファイルの例
Fixtureで、下図のようなインスタンスを作成してみたいと思います。
Fixtureファイルは、JSON形式で記述する場合以下のようになります。
Personの"company"フィールドではForiegnKeyでリレーションを張っているので、Companyのプライマリーキーを指定しています。もしManyToManyFieldの場合は、[1,2]
のようにリストの中にプライマリーキーを指定します。
project/app/fixtures/initial_data.json
[
{
"model": "app.company",
"pk": 1,
"fields": {
"name": "Apple"
}
},
{
"model": "app.company",
"pk": 2,
"fields": {
"name": "テスラ"
}
},
{
"model": "app.person",
"pk": 1,
"fields": {
"name": "Jobs",
"age": 25,
"company": 1
}
},
{
"model": "app.person",
"pk": 1,
"fields": {
"name": "Wazniak",
"age": 27,
"company": 1
}
},
{
"model": "app.person",
"pk": 2,
"fields": {
"name": "イーロン・マスク",
"age": 30,
"company": 2
}
}
]
YAMLを使う場合は、pip install pyyaml
コマンドで、PyYAMLをインストールする必要があります。インストールしていない状態でコマンドを叩くと、ModuleNotFoundError: No module named 'yaml'
とエラーが出ます。
また、拡張子を.yml
とすると、CommandError: Problem installing fixture 'initial_data': yml is not a known serialization format.
とエラーが出てしまうので、拡張子は.yaml
を使用してください。
project/app/fixtures/initial_data.yaml
- model: app.company
pk: 1
fields:
name: Apple
- model: app.company
pk: 2
fields:
name: テスラ
- model: app.person
pk: 1
fields:
name: Jobs
age: 25
company: 1
- model: app.person
pk: 2
fields:
name: Wazniak
age: 27
company: 1
- model: app.person
pk: 3
fields:
name: イーロン・マスク
age: 30
company: 2
コマンドでDBに反映
以下のように、python manage.py loaddata [ファイル名]
コマンドで、Fixutreファイルをデータベースに反映します。
models.py
$ python manage.py loaddata initial_data.json
Installed 5 object(s) from 1 fixture(s)