Djangoのデータをある特定の値に一括更新したい時はないでしょうか?
いちいちfor文で回してsave()することは、パフォーマンス(実行速度)も悪く、何度もデータベースにsave()するのは気持ちが悪い状況です。
今回はそんなデータの一括更新ができるメソッドのbulk_update()を紹介します。
コンテンツ
環境
・Python3.8
・Django3.2
※今回紹介するbulk_updateメソッドはdjango2.2からサポートされています。
for文でsaveは悪手である
実際に例に出して紹介します。
例えばとあるブログのモデルがあって、下書きと公開中の可否をreleaseフィールドで判定しているレコードで、記事(release)を全て一括で非公開(False)から公開(True)にしたいと思いました。
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 |
from django.db import models class Blog(models.Model): """ブログ記事 """ title = models.CharField( verbose_name='title', max_length=255, null=False, ) description = models.CharField( verbose_name='description', max_length=4096, null=False, ) 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側の処理で、releaseを一括して公開(True)にしたいと考えます。
その時for文とsave()を使用してかくとこんな感じのコードになると思います。
1 2 3 4 5 |
blog_qs = Blog.objects.all() for blog in blog_qs: blog.release = False blog.save() |
まず1行目で、all()で全てのデータを取り出します。
そして3行目からfor文とsave()でデータを書き換えていきます。
非常にシンプルですが、パフォーマンス(実行速度)も悪く、何度もデータベースにsave()するのは気持ちが悪いです。
save()と同様にupdate()もありますが、これも悪手です。
・パフォーマンスが悪い
・何度も何度もsave()するのが気持ち悪い
パフォーマンス(処理速度)の悪さは、1万件とかデータを用意して処理時間を計測すれば明確に計測できますがここでは割愛します。
ではどうすれば良いのかを次で紹介します。
データの一括更新
データを一括更新するには、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を教えてくれるスクールをまとめ紹介しています。
コメントを残す