【django】モデルの get_or_create()の使い方

スポンサーリンク
Django

あまり使わないかもしれない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】update_or_create()の使い方
djangoのQuerySetの関数 "update_or_create()" をサンプル付きで紹介します。用途としては、あるデータベースのテーブルに既存のデータがあれば、更新します。テーブルに何もなければ、新規追加するものです。

また、さらにdjangoのスキルを向上させたいなら、レベルごとにおすすめの本を以下の記事で紹介しています。

また、djangoを使った仕事に転職したい場合、プログラミングスクールで学び実戦経験を積んだ上で実行することをオススメします。

そのdjangoのプログラミングスクールを以下の記事で紹介しています。

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