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業界へ参入するならスクールで学ぶのが一番の近道になります。