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

スポンサーリンク
Django

あまり使わないかもしれないQuerySetの関数 “get_or_create()” を紹介

用途としては、あるデータベースのテーブルに
条件に合う既存のデータがあれば、取得します。
テーブルに条件の合うものがなければ、新規追加するものです。

get_or_createの用途

使用場所がなかなか思いつきませんでした。
get と create を使い分ける箇所ってないもんですね。
(私の想像力不足が否めないですが…)

思いついた使用場所としては
順番に並んだデータを確認しつつも
そのデータに抜けがあり、抜けデータを補う場合です。

つまり、不足データがあるかを確認しつつ
あったら、新規追加で補う場合です。

以下のようにデータが本来4つ(1~4)あるうちの
1と3しかない場合を前提とします。

この場合、get_or_create()を使い
かつ、for文とdefaultsで対応します。

get_or_createの使用例

サンプルです。このように使います。

models.py

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length = 50)

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) 

ここで “Person.objects.get_or_create()” が使われます。
for文で回している変数 ” i ” でデータを一つずつ確認します。
なかった場合、defaults で設定した文字を”name”に入れます。

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>

出力結果

上記のようにコードを組み上げます。
そして、”runserver”でアプリを立ち上げると
以下のようなリストが出てきます。

1~4の中で1, 3はあるため人名がありますが
2, 4はデータがなかったため、defaultsにあった”no-name”が入ります。

ちなみに、管理画面ではしっかりとデータ入ります。

最後に

以上がget_or_create()関数でした。

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

似た記事として「【django】update_or_create()の使い方」があります。

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

良ければどうぞ。

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