Djangoのデータを一括作成や一括更新したい時はないでしょうか?
いちいちfor文で回してsave()することは、パフォーマンス(実行速度)も悪く、何度もデータベースにsave()するのは気持ちが悪い状況です。
今回はそんなデータの一括更新ができるメソッドを紹介します。
コンテンツ
環境
・Python3.8
・Django3.2
for文でcreateは悪手である
実際に例に出して紹介します。
例えばとあるブログのモデルがあって、一度にダミー記事を一括作成したいと考えました。
models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
from django.db import models class Blog(models.Model): """ブログ記事 """ title = models.CharField( verbose_name='title', max_length=255, blank=True, null=True, ) description = models.CharField( verbose_name='description', max_length=4096, blank=True, null=True, ) release = models.BooleanField( verbose_name='release', default=False, ) created_at = models.DateTimeField( verbose_name='created_at', auto_now_add=True, ) updated_at = models.DateTimeField( verbose_name='updated_at', auto_now=True, ) |
これをviews側の処理で、一度に1000件を一括作成します。
その時for文とcreate()を使用してかくとこんな感じのコードになると思います。
1 2 3 |
range = 1000 for _ in range(range): Blog.objects.create(title="sample", description="sample") |
1000件なのでrange = 1000と変数を置きます。
そして2行目からfor文とcreate()でデータを生成していきます。
非常にシンプルですが、パフォーマンス(実行速度)も悪く、何度もデータベースにcreate()するのは気持ちが悪いです。
・パフォーマンスが悪い
・何度も何度もsave()するのが気持ち悪い
ではどうすれば良いのかを次で紹介します。
データの一括作成
先ずはデータを一括作成するbulk_create()メソッドを使用します。
今回も1000件のダミー記事を作成することにします。
bulk_createの使い方
1 2 3 4 5 6 7 8 |
blog_items = [] range = 1000 for _ in range(range): blog_items.append(Blog(title="sample", description="sample")) Blog.objects.bulk_create(blog_items) # 一括作成 |
1行目でblog_itemsという空のリストを用意します。
for文で回しながら、blog_itemsにappend(追加)をしていきます。
最後にbulk_createを使用して一括作成します。
こっちの方がパフォーマンスもよく気持ち悪くないですね。
djangoチュートリアル公式でも推薦されています。
データの一括更新
次にデータを一括更新する方法を紹介しますが、一括更新を実行するにはbulk_update()メソッドを使用します。
bulk_updateメソッドの第一引数にはobjectsを、第二引数にはfieldsを指定します。
bulk_updateの使い方
1 2 3 4 5 6 7 |
blog_qs = Blog.objects.all() for blog in blog_qs: blog.release = False Blog.objects.bulk_update(blog_qs, fields=["release"]) # 一括更新 |
1行目で呼び出した、blog_qsをfor文で、全てFalseにするまでは一緒ですが最後にbulk_updateを使用して一括更新します。
こっちの方がパフォーマンスもよく気持ち悪くないですね。
djangoチュートリアル公式でも推薦されています。
最後に
いかがでしたでしょうか。
以上が、「【Django】データの一括更新を実行する【bulk_update】」の紹介記事になります。
プログラミング学習を効率良く進めるには…
私ヒロヤンがプログラミングを始めた頃は以下のような感じでした。
そしてネットで調べていくうちに膨大な時間が過ぎていきました。
私ヒロヤンの実体験より、プログラミングを効率的に学ぶために大切なことは以下のことだと考えています。
1. いつまでもダラダラとやらないで、目標を決定して短期集中する
2. マンツーマンで、わからない箇所は直ぐに質問をして即レスをもらう
.proでは私ヒロヤンが学習してきたプログラミング経験0からのpython/django、その他webサイト・サービス開発のコースが用意されています。
カウンセリング自体は無料なので話を聞いてみるだけでもいかがでしょうか?
また以下のリンク先ではdjangoを教えてくれるスクールをまとめ紹介しています。
コメントを残す