5
3

More than 1 year has passed since last update.

Djangoで初期データをfixtureで登録・dump

Last updated at Posted at 2021-09-12

DjangoでDBにfixtureでデータ初期登録

初期データやテストで使うデータをデータベースに最初から用意しておきたいということがあります。
そんなときに使うのがfixtureです。Djangoで初期データを登録する方法を書きます。

image.png

django_docker/accounts/models.py
from django.db import models


class Customer(models.Model):
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=255)
    age = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)

fixtureファイル準備

今回はJSONを使います。XMLYAMLでも記述できます。
アプリ(今回の場合はaccountsというアプリ名で作ってます)の中にfixturesというディレクトリを作成してその中にcustomer_init.jsonを作成

django_docker/accounts/fixtures/customer_init.json
[
  {
    "model": "accounts.customer",
    "pk": 1,
    "fields": {
      "name": "Tanaka Tarou",
      "phone": "09011111111",
      "email": "tanaka@gmail.com",
      "age": 35,
      "created_at": "2021-09-13 00:00:05"
    }
  },
  {
    "model": "accounts.customer",
    "pk": 2,
    "fields": {
      "name": "Satoh Jirou",
      "phone": "09022222222",
      "email": "satoh@gmail.com",
      "age": 25,
      "created_at": "2021-09-13 00:00:10"
    }
  }
]

コマンドでDBに入れる

データを入れるのは簡単で、コマンドをたたけば完了です。

python manage.py loaddata customer_init.json

入れたデータを確認

データを入れたので、Django shellで確認してみます。

>>> Customer.objects.all()
<QuerySet [<Customer: Customer object (1)>, <Customer: Customer object (2)>]>
>>> for c in Customer.objects.all():
...     print(c.name, c.phone, c.email, c.age, c.created_at)
... 
Tanaka Tarou 09011111111 tanaka@gmail.com 35 2021-09-12 15:00:05+00:00
Satoh Jirou 09022222222 satoh@gmail.com 25 2021-09-12 15:00:10+00:0

DBの設定やってなくて、DBのタイムゾーンの問題でUTCになっていますが想定したデータが投入されていますね。

DBデータをdump

jsonファイルで手書きで作っても良いですが、データ数多くなると間違いも増えるし、手間がかかって仕方ありません。そんなときはデータをダンプしましょう。

python manage.py dumpdata <アプリ名> > ファイル名でダンプできます。

python manage.py dumpdata accounts > accounts.json

改行されていないですが、ダンプできました。

accounts.json
[{"model": "accounts.customer", "pk": 1, "fields": {"name": "Tanaka Tarou", "phone": "09011111111", "email": "tanaka@gmail.com", "age": 35, "created_at": "2021-09-12T15:00:05Z"}}, {"model": "accounts.customer", "pk": 2, "fields": {"name": "Satoh Jirou", "phone": "09022222222", "email": "satoh@gmail.com", "age": 25, "created_at": "2021-09-12T15:00:10Z"}}]

もしくは特定のmodel(テーブル)のデータだけ取り出したいということもあると思います。
そんな時は

python manage.py dumpdata <アプリ名>.<model> > ファイル名でダンプできます。

python manage.py dumpdata accounts.customer > accounts_customer.json

今回はmodel一つしかないので同じですが:sweat_smile:、場合によってはバックアップにも使えますね。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3