Djangoでfixtureを使って初期データを投入する
この間テストを書くときに ModelName.objects.create()
でデータを作っていましたが、後々見つけたfixtureを触ってみたのでそれについて。
前の記事: DjangoでTestCaseを使ってテストを書いた · PengNote
今回はテストデータではなく、テスト環境で使うデータの投入。
ProjectやAppの作成、登録は終わっている状態。
環境など
- Python v3.6.5
- Django v2.0.7
ディレクトリ構造
最終的なディレクトリ構造です。
/
├── db.sqlite3
├── manage.py
├── App
│ ├── apps.py
│ ├── fixtures
│ │ └── fixture.json
│ ├── models.py
│ └── views.py
└── ProjectDir
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
Moddelの作成とfixtureの準備
Modelの作成
Modelは仮でこんな感じで app/models.py
に記述。
from django.db import models
class Person(models.Model):
name = models.CharField('名前', max_length=128)
def __str__(self):
return self.name
fixtureの作成
App/fixtures/fixture.json
を作成。
上で作成したModelに対してfixtureを作っていくのでこんな感じ。
[
{
"model": "App.Person",
"pk": 1,
"fields": {
"name": "山田太郎",
}
},
{
"model": "App.Person",
"pk": 2,
"fields": {
"name": "田中二郎",
}
}
]
他のテーブルが絡んだときどう書くかがまだ分かってないんだけど、単体ならこんな感じになりました。
データを投入する
fixtures/initial_data.json
とかって作っておくと、 ./manage.py migrate
で毎回入れてくれるっていう話を見かけたのですが、上手くいかず…
暫定的にもう1つの以下の方法でとりあえず入れています。
migrate での入れ方が分かったら追記しようかな。
$ ./manage.py loaddata App/fixtures/fixture.json
テストの SetUp()
で指定する方法もあるらしいので、今度試してみます。
参考
おまけ
データが入っているかの確認は、DBeaverを使うのが楽でした。
MySQLやPostgreSQL、SQLiteなどなど色々対応しているらしく、ER図生成してくれるのも便利です。