DjangoBrothers BLOG

2018/07/26

このエントリーをはてなブックマークに追加
Django モデル

Fixtureの使い方 初期データ追加を自動化しよう!

Djangoでは、便利なAdminページが用意されてますので、下の画像のように、「追加ボタン」からインスタンスを一つ一つ追加することができます。

開発中は、サンプルとなるインスタンスをいくつか作成することで、実際の挙動を確認することも多くなるでしょう。今日は、このインスタンス作成作業を自動化してくれるFixtureというものを紹介します。

Fixtureを作るメリット

・何かしらの理由でデータベースの中身を削除しても、Fixtureを作っておけば一発でデータ投入できる。

・コマンドさえ叩けば、共同開発者のローカル環境でも同じデータをすぐに作成できる。

Fixtureの使い方

Fixtureの使い方は簡単です。

  1. アプリフォルダ内に、fixturesというフォルダを作成します。

  2. fixturesフォルダ内に、JSON、XML、YAMLいずれかの形式のファイルを作成します。このファイルで、どんなデータを作成するのか定義します。

  3. コマンドを打つことで、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)
SHARE ! Tweet