djangoでfixtureを使って初期データ、テストデータを用意する

djangoでfixtureを使って初期データ、テストデータを用意する

初期データや、テスト用のデータを用意できるfixtureと言う機能がdjangoには備わっているようです。今回はそれをつかってみたいと思います。

参考:
  django データ投入 dumpdata loaddata
  Djangoで、初期データの投入

モデルを用意する

下記の通りのモデルを用意してみました。


from django.db import models


class Writer(models.Model):
    name = models.CharField(max_length=128)


class Article(models.Model):
    writer = models.ForeignKey(Writer,
                               on_delete=models.CASCADE,
                               related_name='articles')
    title = models.CharField(max_length=512)
    contents = models.TextField()

ディレクトリを用意する

ダンプしたファイルを格納するディレクトリを下記の階層に用意します。


django_project
├── config
│   └── settings.py
├── manage.py
└── myapp
    └── fixtures # 作成

dumpファイルを作成する

データベースのデータをファイルにするには下記のdumpdataコマンドを実行します。特定のアプリのみダンプしたい時は下記の通りアプリ名を指定して実行します。デフォルトではjson形式で出力されるそうです。


python manage.py dumpdata myapp > myapp/fixtures/myapp.json

特定のモデルのみダンプする場合は下記の通り「[app名].[モデル名]」と指定できます。


python manage.py dumpdata myapp.writer > myapp/fixtures/myapp_writer.json

プロジェクト全てのデータをダンプするにはアプリもモデルも指定しません。


python manage.py dumpdata > data.json

dumpファイルをデータとして読み込めるようにする

作成したファイルを実際にデータベースにリストアするには下記のloaddataコマンドを実行します。


python manage.py loaddata myapp/fixtures/data.json

※完全に上書きではなく、差分を見て削除されたデータを新しいプライマリーキーで挿入する。この為dumpdata後に挿入したデータはloaddataしても削除されないっぽい。

yaml形式を指定する場合

上記の通りフォーマットを指定しないとjson形式になるらしいので、yamlを指定する場合は下記の通り。

【PyYAMLをインストール】


pip install PyYAML

【dumpdata】


python manage.py dumpdata --format=yaml myapp > myapp/fixtures/data.json

【loaddata】


python manage.py loaddata --format=yaml myapp/fixtures/data.json