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

# 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} )
```

```.py:test.html
{% for test in tests %}
    <div>
        <h1>{{ test.testfield }}</h1>
    </div>
{% endfor %}

```

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

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

```.py:利用の準備
>>> from blog.models import Test                 #Postモデルのインポート
```
それでは検証していきたいと思います。

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

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

リロードしてみます。
<img width="1440" alt="スクリーンショット 2019-06-26 21.21.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219573/a62063f2-bba7-4e87-2358-6b9fc7ba5b7f.png">



更新されました！

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

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

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

Webページをリロードしてみましょう。
<img width="1440" alt="スクリーンショット 2019-06-26 21.21.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219573/a03c05b0-5ca8-eba6-595f-1df42e8aba2c.png">


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

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

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

Webページをリロードしてみます。
<img width="1440" alt="スクリーンショット 2019-06-26 21.25.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219573/bbdec303-0f0a-737d-8f6e-8a7c012af106.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()し忘れも無くなりそうですね。


#### モデルデータの削除時
今度はデータを削除してみましょう。

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

リロードしてみましょう。
<img width="1439" alt="スクリーンショット 2019-06-25 23.44.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219573/34f8f5e1-007c-313f-73a4-19c8e095dcd9.png">

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

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

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

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


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