Help us understand the problem. What is going on with this article?

[Django] マスタデータの作り方

More than 1 year has passed since last update.

この記事について

Django でマスタデータ(初期データ)を準備する方法についてのメモです。
以下の内容を説明します。

1.データの編集
2.データのエクスポート
3.データのインポート(コマンド or マイグレーション内での実行)

1.データの編集

最初にデータベースにデータを登録します。データの登録には管理コマンドのshellを使ってもいいのですが、一般的にはデータベース管理ツールと呼ばれるソフトを使い、データベース内のテーブルをエクセルのように直接編集する方法を採ります。

データベース管理ツールは主に3種類存在しますが、大体機能は似たり寄ったりなので好きなものを使えばいいでしょう。

1.特定のデータベース専用のもの(phpMyAdmin, pgAdmin等)
2.IDE(PyCharm等)の機能として組み込まれているもの
3.フリーソフト

2018年現在で人気のフリーソフトは「TeamSQL」及び「DBeaver」です。「DBeaver」は知名度が低いですが日本語対応しているので初心者には使いやすいかと思います。

DBeaverメモ

  • データベースから一度に取得する件数は、初期状態では200件と少なめです。データベースを選択した状態で「ファイル」⇒「プロパティ」と選択し、設定画面のEditor→結果セットにてフェッチサイズを変更しましょう(0で全件取得)

  • エクセルのデータをテーブルにコピー&ペーストする手順

    • 1.エクセルの表をコピー
    • 2.テーブル表示の下の「新しい行を追加」をクリック
    • 3.新しい行全体を選択して、右クリックより「高度なペースト」を実行
    • 4.保存(Save)

2.データのエクスポート

データをテキスト形式でエクスポートし、どのタイプのデータベースへもインポートできるようにします。Djangoでは初期データとしてプロジェクトに付属させるファイルのことをFixtureファイルと呼んでいます。Fixtureファイルはdumpdataコマンドで作成します。標準の出力フォーマットはJSON形式です(一応yml/xml形式も使える)。

manage.py dumpdata <app_name>.<model_name> > <file_name>.json

※ model_nameを省略するとアプリ全体が対象になる。

エクスポートのメモ

  • 出力されたJSONファイルは整形されていません。IDEやテキストエディタの機能で整形しましょう。indentオプションでも可能ですが、ファイルの最初と最後がインデントされておらずちょっと微妙です。

  • 日本語の文字列はunicodeの「¥uXXXX」形式にエスケープされます。文字列の内容の確認にはこのようなツールを使います。

3.データのインポート

※ initial_data.jsonによる初期データの投入はDjango 1.7+で廃止となりました。

コマンドによるインポート

アプリのディレクトリにfixturesというディレクトリを作り、エクスポートしたファイルを格納します。その後以下のコマンドを実行して対象ファイルをインポートします。file_nameに拡張子は不要です。loaddataの動作は「対象のidがあれば上書き、なければ新規登録」なので重複して実行してもエラーにはなりません。

manage.py loaddata <file_name> --app <app_name>

migrationファイルによるインポート

migrationファイル内でloaddataコマンドを呼び出すことで、自動的に初期データを登録することができます。

手順1.以下のコマンドを実行して空のmigrationファイルを作る

manage.py makemigrations <app_name> --empty

手順2.作成された空のマイグレーションを書き換えてloaddataを組み込む。

from django.core.management import call_command
from django.db import migrations


def load_fixture(apps, schema_editor):
    call_command('loaddata', '<file_name>', app_label='<app_name>')


class Migration(migrations.Migration):
    dependencies = [
        ('sample', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(load_fixture),
    ]

適用の取り消しが必要な場合はreverse_codeオプションを定義する。
参考:https://stackoverflow.com/questions/25960850/loading-initial-data-with-django-1-7-and-data-migrations

参考:

okoppe8
札幌でシステムエンジニアをしています。 「Djangoで業務システム作る時に必要な機能をあらかじめ用意する」というテーマでやってます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした