あまり使わないかもしれないQuerySetの関数 「get_or_create()」 を紹介します。
用途としては、あるデータベースのテーブルに、条件に合う既存のデータがあれば、get()と同じように取得します。
テーブルに条件の合うものがなければ、create()のように新規追加するものです。
つまり、データベースに合致するデータがあるか否かで、get()かcreate()の効果を分岐できるものが「get_or_create()」です。
この記事を読めば、djangoのQuerySet関数「get_or_create()」の使い方が分かります。
get_or_createの用途・使う場所
get_or_create()の使用場所はなかなか思いつきませんでした。
get と create を使い分ける箇所って意外とないですね。(私の想像力不足が否めないですが…)
思いついた使用場所としては、順番に並んだデータ(例えば、1,2,3,…など)をそれぞれ確認しつつも、そのデータに抜けがあった場合、抜けているデータを補う場合です。
つまり、データを取得しつつも、不足データがあるかを確認します。
もし不足が合ったら、新規追加で補うような状況です。
例えば、以下のようにデータが本来4つ(Person object(1)~(4))あるうちの、Person object(1)と(3)しかない場合を前提とします。
ちなみにここでの(1)にはNakataという名前と(3)にはSaekiという名前が入っています。

この場合、Person objectからNameデータを取得しつつ、データがない場合は補っていきます。
それをget_or_create()を使いつつ、for文とdefaultsを使って対応していきます。
get_or_createの使用例
サンプルです。このように使います。
まず、models.pyからです。
models.py
from django.db import models
class Person(models.Model):
name = models.CharField(max_length = 50)
models.pyでPersonモデルの中に「name」という項目を設定します。
次にviews.pyです。
views.py
from django.shortcuts import render
from .models import Person
def get_or_createf(request):
personlist = Person.objects.all()
context = {
'personlist':personlist,
}
for i in range(1,5):
person, created = Person.objects.get_or_create(id=i, defaults={'name':'no-name'})
if created:
print('new object is created!')
else:
print('this object is already exist!', person)
return render(request, 'sample.html',context)
ここで 10行目、for文の下に”Person.objects.get_or_create()” が使われます。
for文で回している変数 ” i ” でデータを一つずつ確認します。
確認したデータは変数”person”に入れます。createdにはデータがあった場合は、”True”が入ります。
データを確認したが、条件にあったデータがなかった場合、get_or_create()のdefaults で設定した文字を”name”に入れます。
createdには”False”が入ります。
次はtemplatesでフロント部分を編集していきます。
templates
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Person</title>
</head>
<body>
{% for person in personlist %}
{{ person.id }}:{{ person.name }}</br>
{% endfor %}
<hr/>
</body>
</html>
ここではviews.pyで設定した”personlist”という変数からfor文を使ってpersonオブジェクトを取り出しています。
このHTMLの出力結果は以下の写真のようになります。
出力結果
上記のようにコードを組み上げたあと、”runserver”でアプリを立ち上げると、以下のようなリストが出てきます。

1~4の中で1, 3は既にあったため、設定済みの人名が入りますが、2, 4はデータがなかったため、defaultsにあった”no-name”が入ります。
ちなみに、管理画面ではしっかりとデータ入ります。

最後に
以上がget_or_create()関数でした。
お付き合いいただきありがとうございます。
QuerySet関数で似た関数として「【django】update_or_create()の使い方」があります。

また、さらにdjangoのスキルを向上させたいなら、レベルごとにおすすめの本を以下の記事で紹介しています。
また、djangoを使った仕事に転職したい場合、プログラミングスクールで学び実戦経験を積んだ上で実行することをオススメします。
そのdjangoのプログラミングスクールを以下の記事で紹介しています。