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

Django データベースが更新されるタイミングはいつか?

More than 1 year has passed since last update.

Django データベースが更新されるタイミングを調べる

いったいどのタイミングでデータベースが更新されるのでしょうか。本記事ではそれを検証していこうと思います。

かなり初心者向けの記事だと思います。ご注意ください。

方法

まず、ターミナルからプロジェクトのアプリケーションをローカルサーバで起動し、ウェブページにアクセスしておきます。
次に、同一アプリケーションのDjangoインタプリタを起動し、ここからモデルを通じたデータベースの操作を行い、どのタイミングでページが更新されるのかを確認していきます。

以下はサーバの起動方法とDjangoインタプリタ起動のコマンドです。

サーバの起動方法
python manage.py runserver
Djangoインタプリタの起動方法
python manage.py shell

検証

準備

テストに使用するmodels.py、urls.py、views.py、更新の確認を行うためのHTMLはそれぞれ以下のようにしました。

models.py
from django.db import models

class Test(models.Model):
    testfield = models.TextField()

    def setText(self, text):
        self.testfield = text
        pass
urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.test_list, name='test_list'),
]

views.py
from django.shortcuts import render
from .models import Test

def test_list(request):
    tests = Test.objects.all()
    return render(request, 'blog/test.html', {"tests": tests} )
test.html
{% for test in tests %}
    <div>
        <h1>{{ test.testfield }}</h1>
    </div>
{% endfor %}

更新を確認するためのHTMLは、受け取ったモデルデータのフィールドを表示します。
testsになにもない状態であれば、何も表示しません。

インタプリタの起動

以下のコマンドを検証の準備としてインタプリタに打ち込みます。

利用の準備
>>> from blog.models import Test                 #Postモデルのインポート

それでは検証していきたいと思います。

モデルデータの作成時

モデルデータの作成を行ってみましょう。

モデルデータの作成
>>> Test.objects.create(testfield='テストその1〜create〜')

リロードしてみます。
スクリーンショット 2019-06-26 21.21.55.png

更新されました!

モデルデータをcreateすると、直ちにデータベースが更新されることがわかりました

モデルデータの変更時

次にモデルの変更を行ってみます。

データの変更
>>> test = Test.objects.get(testfield='テストその1〜create〜')
>>> test.testfield = 'テストその2~change~'

Webページをリロードしてみましょう。
スクリーンショット 2019-06-26 21.21.55.png

はい、変わっていません。
どうやら、値を代入するだけでは値が更新されないということがわかりました。

では、どうすればデータベースが更新されるのでしょうか。
以下を実行してみます。

データの変更を保存する
>>> test.save()

Webページをリロードしてみます。
スクリーンショット 2019-06-26 21.25.44.png

更新されました!
どうやら値を変更した際はsave()を使い、データベースを更新する必要があるようです!

変更していちいちsave()するのはめんどくさいですし、save()し忘れる危険性がありますから、こんな風にmodelsを変更してあげると楽かもしれません。

models.py
from django.db import models

class Test(models.Model):
    testfield = models.TextField()

    def setText(self, text):
        self.testfield = text
        self.save()            # 変更したらセーブする!
        pass

メソッドを通して値を変更すればsave()し忘れも無くなりそうですね。

モデルデータの削除時

今度はデータを削除してみましょう。

データを削除する
>>> test.delete()

リロードしてみましょう。
スクリーンショット 2019-06-25 23.44.02.png

データが消えました!
削除は即反映されるようです

まとめ

データベースの更新は以下のタイミングで行われることがわかりました。

Model.objects.create()した時、また、Model.objects.delete()したとき
Model.objects.save()したとき

このことから、Model.objects.save()するタイミングは値を変更したときだけで良いということがわかりました!

当記事について

 セミナーでアプリを作る上でやったことを進捗報告会のために記録する必要があるんですが、どうせ記録するのであれば記事にしてしまえ、ということで、この記事を作成しました。これからもアプリを作る上でやったことをまとめていきます。

tukine_T
AITで学生やってます。
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