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

Django

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

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

create() と save()の使い方

使い方は非常に簡単です。

models.pyで設定されている要素を合う形でキー引数と値を設定します。
たとえば、models.pyは以下の形とした時

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()

実際の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():
            
            # sample.objects.create(**form.cleaned_data) #create()
            # or
            sample = Sample(**form.cleaned_data) #save()のための準備
            sample.save() #save()
            return render(request, 'lists.html', context)

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

ここではform.is_valid()でバリデートします。
入力された値が条件に合っているかを確認する作業です。

そして、「**form.cleaned_data」では2つの意味があります。
**には複数のキーワード引数を辞書として受け取ります。
form.cleaned_dataにはバリデート後のデータ型に応じた方になったものが入っています。
この場合だと、両方ともstr型ですね。

一つずつキーワード引数を当てるより
「**form.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を一覧として出力する部分、フォームを使う部分があるだけです。

最後に

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

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

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