Django データベースが更新されるタイミングを調べる
いったいどのタイミングでデータベースが更新されるのでしょうか。本記事ではそれを検証していこうと思います。
かなり初心者向けの記事だと思います。ご注意ください。
方法
まず、ターミナルからプロジェクトのアプリケーションをローカルサーバで起動し、ウェブページにアクセスしておきます。
次に、同一アプリケーションのDjangoインタプリタを起動し、ここからモデルを通じたデータベースの操作を行い、どのタイミングでページが更新されるのかを確認していきます。
以下はサーバの起動方法とDjangoインタプリタ起動のコマンドです。
python manage.py runserver
python manage.py shell
検証
準備
テストに使用するmodels.py、urls.py、views.py、更新の確認を行うためのHTMLはそれぞれ以下のようにしました。
from django.db import models
class Test(models.Model):
testfield = models.TextField()
def setText(self, text):
self.testfield = text
pass
from django.urls import path
from . import views
urlpatterns = [
path('', views.test_list, name='test_list'),
]
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} )
{% 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〜')
更新されました!
モデルデータをcreateすると、直ちにデータベースが更新されることがわかりました。
モデルデータの変更時
次にモデルの変更を行ってみます。
>>> test = Test.objects.get(testfield='テストその1〜create〜')
>>> test.testfield = 'テストその2~change~'
はい、変わっていません。
どうやら、値を代入するだけでは値が更新されないということがわかりました。
では、どうすればデータベースが更新されるのでしょうか。
以下を実行してみます。
>>> test.save()
更新されました!
どうやら値を変更した際はsave()を使い、データベースを更新する必要があるようです!
変更していちいちsave()するのはめんどくさいですし、save()し忘れる危険性がありますから、こんな風にmodelsを変更してあげると楽かもしれません。
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()
データが消えました!
削除は即反映されるようです。
まとめ
データベースの更新は以下のタイミングで行われることがわかりました。
・Model.objects.create()
した時、また、Model.objects.delete()
したとき
・Model.objects.save()
したとき
このことから、Model.objects.save()
するタイミングは値を変更したときだけで良いということがわかりました!
当記事について
セミナーでアプリを作る上でやったことを進捗報告会のために記録する必要があるんですが、どうせ記録するのであれば記事にしてしまえ、ということで、この記事を作成しました。これからもアプリを作る上でやったことをまとめていきます。