Django

Django modelインスタンスでsaveメソッドを使う方法

(最終更新月:2022年1月)

当記事はこんなお悩みがある方へ向けて書かれています

「Djangoのsaveメソッドを使って保存する方法が知りたい!」

「データの保存方法ってどんな方法があるの?」

「データ保存の実例があれば教えて欲しい!」

当記事を通じてお伝えすること

  • Django saveメソッドでmodelへデータを保存する2ステップ
  • saveメソッドを使わずに保存する方法と比較|オススメは?
  • クリエイトビューの実例を紹介

実例付きでご紹介しますので、当記事を読み終わる頃にはsaveメソッドについては完全マスターです!

✔独学におすすめ

saveメソッドでmodelクラスへデータを保存する2ステップ

インスタンスの作成

変数名 = モデルクラス(フィールド名1=値1, フィールド名2=値2, …)

新たなモデルクラスインスタンスを作成します

インスタンスの保存

作成したインスタンス.save()

インスタンスを作成しただけでは保存できません

saveメソッドを使って保存しましょう!

createメソッドで保存する方法

[ad]

モデルインスタンス.objects.create(フィールド名=値、、、)

メリット

いちいち、saveメソッドを使用する必要はありません

一行で保存まで完了します

デメリット

インスタンスが作られません

実際に保存する前後でインスタンスを使った記述をしたい場合は不便です

クリエイトビューの実例を紹介

i got it!

実際の例を見ながら、今回見てきたものを整理していきましょう

フォームの表示から値を受け取るまで

見た目はともかくとして、カンタンなフォームを作成しました

【templates > nippo > nippo-form.html】

{% extends "base.html" %}
{% block title %}日報を作成しよう{% endblock %}

{% block content %}
    <form method="POST">{% csrf_token %}
        <div>
            <input name="title" type="text" placeholder="タイトル..."/>
        </div>
        <div>
            <textarea type="text" name="content" placeholder="日報..."></textarea>
        </div>
        <button type="submit">送信</button>
    </form>

{% endblock %}

フォームから値を受け取るview関数です(保存のための記述はこれからです)

【views.py】※printメソッドを使ってターミナル上に値が出力されるのをご確認ください

def nippoCreateView(request):
    template_name="nippo/nippo-form.html"
    if request.POST:
        title = request.POST["title"]
        content = request.POST["content"]
    
    return render(request, template_name)

受け取った値を保存していきます

データを新規登録・保存する方法

当日報アプリでは、

obj = NippoModel(title=値, content=値)
obj.save()

とすることで保存できます

view関数全体は、

def nippoCreateView(request):
    template_name="nippo/nippo-form.html"
    if request.POST:
        title = request.POST["title"]
        content = request.POST["content"]
        obj = NippoModel(title=title, content=content)
        obj.save()
    return render(request, template_name)

のようになります

追記した点は下記のとおりです

def nippoCreateView(request):
    ...
    if request.POST:
        ...
        obj = NippoModel(title=title, content=content)
        obj.save()
    ...

フォームが送信されてから保存をするようにif文も追記する必要があります

まとめ

[ad]

これまでのことをまとめます

保存するための方法は2つあります

  1. インスタンスを作り、saveメソッドを使う方法
  2. createメソッドでダイレクトに保存する方法

それぞれ一長一短ですので、場面に応じて使い分けましょう!

ただ、色々と試してみてお気づきかもしれませんが、このままですとフォームが空のままでも保存ができてしまいます

HTML上でフォームを入力必須にすることもできるのですが、Djangoには様々なメソッドが用意されているforms.Form」クラスを使い、フォームを作成・表示する方法がとても便利です

この方法を覚えておくと、今後の編集機能などもカンタンに実装できます

次のステップとして、ぜひマスターしていきましょう!