SW개발/Django

[Django]get_or_create() 란?

이번 포스팅에서는 Django QuerySet API 중 하나인 get_or_create에 대해서 알아보겠습니다.

 

get_or_create() 란?

get_or_create는 모델 객체를 생성할 때 이미 있는 객체라면 가져오고 없으면 생성하는 QuerySet API 중 하나입니다.

간단하게 사용법을 알아보겠습니다.

 

기본 사용법

class Leffe(models.Model):
    name = models.CharField(max_length=30)
    ...
    
obj, created = Leffe.objects.get_or_create(name='leffe')

위 코드는 leffe 라는 이름을 가진 객체가 있다면 가져오고 없다면 객체를 생성하여 줍니다. 또한, created 라는 값을 통해 객체의 생성 여부도 파악할 수 있습니다.

 

응용 1 - filter 와 create 분리하기

class Leffe(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    sex = models.CharField(max_length=5)
    ...

위와 같은 모델에서 leffe라는 이름을 가진 객체를 가져오고 없다면, age와 sex의 값을 포함해 객체를 생성하고 싶다면 어떻게 해야할까요?

 

바로 다음과 같이 할 수 있습니다.

obj, crated = Leffe.objects.get_or_create(
    name='leffe',
    defaults={'age': 27, 'sex': 'male'}
)

defaults 부분을 제외하고 keyword 인수로 값을 제공한다면 그 부분들은 모두 get()을 하기 위한 filter로서 사용이 됩니다.

 

응용 2 - filter 부분의 값은 filter 용도로만 사용될까 ?

obj, crated = Leffe.objects.get_or_create(
    name='leffe',
    defaults={'age': 27, 'sex': 'male'}
)

print(created, obj.name, obj.age, obj.sex)
# True, leffe, 27, male

응용1 에서 설명한 코드를 실행한 후 객체의 값을 확인해보면 name의 값이 leffe로 저장된 것을 확인할 수 있습니다. 이를 통해, 키워드 인수로 제공된 부분이 get을 하기위한 filter로 사용이 되는 것은 맞지만, 해당 값이 객체를 생성할 때도 그대로 이용된다는 것을 알 수 있습니다.

 

조금 더 자세한 내용은 공식 문서를 통해 확인할 수 있습니다.

https://docs.djangoproject.com/en/4.0/ref/models/querysets/#get-or-create

 

QuerySet API reference | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

읽어주셔서 감사합니다 :)

 

728x90