【django】モデルのDBにデータを追加する create() と save()

スポンサーリンク
Django

djangoのDBにオブジェクトを追加する際に使われるQuerySetメソッド
Model.objects.create()” と “Model.save()“の2つを解説します。

この”create()“と”save()“は非常に効果が似ていますが、異なる点もあり、非常に分かりにくく悩んでいる方も多いと思います。

そんな方に向けて”create()“と”save()“の違いを説明します。

まず、簡単に説明すると。

この両方ともDBに1つのオブジェクトを追加するために使われるもので
create()の場合は、入力されたデータから「保存用のオブジェクトを作成し、保存する」までを一括で行います。
save()自力で保存用オブジェクトを作成する必要がありますが、オブジェクトとして「保存する」が役割をもっています。

create() と save()の使い方

使い方を紹介します。使い方は非常に簡単です。

models.pyで設定されている要素に合う形でキー引数と値を設定します。

たとえば、models.pyは以下の形とします。
“title”でCharField、”text”ではTextFieldを与えています。

from django.db import models

class Sample(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()

ここで、create()は以下のようにキーワード引数と値を入力すると、オブジェクトが作られてDBに保存されます。

Sample.objects.create(title=“test1”, text=“test1)

save()を使用する場合は、キーワード引数と値を入れたオブジェクトを作成
そのオブジェクトに対して、save()を入れるとDBに保存ができます。

sample = Sample(title=“test1”, text=“test1”)
sample.save()

つまり、create()の方が少ない行でDBにオブジェクトを保存できます。

実際のdjangoでのcreate()とsave()の使い方

実際にdjangoで簡単なアプリを作ってみます。

入力したものが保存できているか確認するためのアプリです。

先ほどは上記のようにキーと値をそれぞれ書きました。

しかし、実際の使用する場合はフォームを通してvalidateしてから保存をします。

その方がDBに保存するには一般的なため、フォームを通してオブジェクトを保存してみます。

models.pyは先ほどと同じものを使用します。

forms.pyはModelFormを使用し、以下のように書きます。

簡単なアプリを作る場合はModelFormが楽ですね。

from django import forms 
from .models import Sample

class SampleForm(forms.ModelForm):
    class Meta:
        model = Sample
        fields = {'title','text'}
        widgets = {
            'title': forms.TextInput(),
            'text': forms.TextInput(),
        }
        labels = {
            'title':'タイトル',
            'text':'テキスト',
        }

views.pyは以下のように作りました。

ここにcreate()save()を使用します。

def lists(request):
    sample_list = Sample.objects.all()
    form = SampleForm(request.POST or None)
    context = {
        'sample_list':sample_list,
        'form':form,
    }
    if request.method == 'POST':
        if form.is_valid():

            # create()の場合
            sample.objects.create(**form.cleaned_data)

       # save()の場合
            sample = Sample(**form.cleaned_data)
            sample.save

            return render(request, 'lists.html', context)
    return render(request, 'lists.html', context)

ここではform.is_valid()でバリデートします。

入力された値が条件に合っているかを確認する作業です。

そして、「**form.cleaned_data」では2つの意味があります。

「**」には複数のキーワード引数を辞書として受け取るという意味です。

「form.cleaned_data」にはバリデート後、ModelFormのwigdetsに合った適切な型のデータが入っています。この場合だと、両方ともstr型ですね。

一つずつキーワード引数を当てるより「**form.cleaned_data」を一つ書いた方が楽ということですね。

cleaned_dataに関しては以下の記事でもまとめてあります。

最後にテンプレートです。

  <div>
    <h1>List Page</h1>
  </div>
  {% for sample in sample_list %}
    <div>
      <p>{{ sample.title }}:{{ sample.text }}</p>
    </div>
  {% endfor %}

  <hr/>
  <form method="POST" class="post-form">{% csrf_token %}
    <input type="text" name="title" maxlength="10"></br>
    <input type="text" name="text" maxlength="30">
    <button type="submit">Save</button>
  </form>

テンプレートは特別な場所はないです。

DBを一覧として出力する部分、フォームを使う部分があるだけです。

最後に

以上がDBにデータを追加するcreate()save()の使い方でした。

お付き合いいただきありがとうございます。

djangoをより学びたい場合の関連記事です。

djangoをレベル別で書籍を使用し、順序よく学びたい方におすすめの本を紹介している記事です。

djangoを初めて学ぶ初学の方や基礎を学び終えた初級の方
アプリを作った・作っている中級の方の3種のレベルに分けておすすめの本を紹介しています。

また、スクールで学び、転職などを目標とする場合はこちらの記事をおすすめします。

Web業界の成長はすごいものがあります。また、djangoを使っている大手も多いです。
djangoを学んでWeb業界へ参入するならスクールで学ぶのが一番の近道になります。

タイトルとURLをコピーしました