get_or_createの使い方
djangoのget_or_createは、DBからレコードを取得したりレコードを挿入したりすることができる。 get_or_createを使うと、 オブジェクトが存在しない場合は、DBにオブジェクトを登録して登録した値を返し、オブジェクトが存在する場合は、DBにオブジェクトを登録せずに値を返す。
以下のように利用する。
result, created = Model.objects.get_or_create(**kwargs)
*) kwargsには、挿入したいレコードの値を指定する。
DBに新たにレコードを挿入しなかった場合には、 createdにはFalseが返され、resultには指定したModelのオブジェクトが返される。
DBに新たにレコードを挿入した場合には、 createdにはTrueが返され、resultには挿入されたModelのオブジェクトが返される。
実際には以下のように記述する。
- Userモデル
class User(models.Model):
first_name = models.CharField(max_length=128)
last_name = models.CharField(max_length=128)
email = models.EmailField(max_length=264, unique=True)
- get_or_create
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'Project.settings') # djangoのDB接続設定読み込み
import django django.setup() # djangoのセットアップ
first_name = "Taro"
last_name = "Tanaka"
email = "aaa@mail.com"
# 1回目の実行
user, created = User.objects.get_or_create(first_name=first_name, last_name=last_name, email=email)
print(user.first_name) # Taro
print(user.last_name) # Tanaka
print(created) # True
# 2回目の実行
user2, created2 = User.objects.get_or_create(first_name=first_name, last_name=last_name, email=email)
print(user2.first_name) # Taro
print(user2.last_name) # Tanaka
print(created2) # False
また、get_or_create()で値を取得した際、選択条件で複数のオブジェクトが返されたら、MultipleObjectsReturnedエラーが返される。
- MultipleObjectsReturnedエラー
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'Project.settings') # djangoのDB接続設定読み込み
import django
django.setup() # djangoのセットアップ
from appTwo.models import User
first_name = "Taro"
last_name = "Suzuki"
email = "bbb@mail.com"
# Taro,Suzukiが登録される
user, created = User.objects.get_or_create(first_name=first_name, last_name=last_name, email=email)
#前回登録したTaro,Tanakaと二つ返されるため、"MultipleObjectsReturned"エラーが返される
user2, created2 = User.objects.get_or_create(first_name=first_name)
get_or_createの応用(filter)
最後に、get_or_createの応用的な使い方について以下に記述する。
fileter関数とdjango.db.modelsパッケージのQクラスを用いて、モデルの一部を抽出しその中に**kwargsで指定した値のレコードがない場合は登録し、ある場合は登録しないこともできる。
以下のように利用する。
result, created = Model.objects.filter(Q=filter).get_or_create(**kwargs)
- filterを用いたget_or_create
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'ProTwo.settings') # djangoのDB接続設定読み込み
import django
django.setup() # djangoのセットアップ
from django.db.models import Q
from app.models import User
last_name = "Suzuki"
email = "ccc@mail.com"
user, created = User.objects.filter(
Q(first_name='Taro') | Q(first_name='Jiro')
).get_or_create(last_name=last_name, defaults={'first_name': 'Taro'})
# Userクラスで、first_nameがTaro,Jiroのものの中で、last_nameがSuzukiのものがあれば、Taro,Suzukiで登録し、createdにはTrueが返される