이번 포스팅에서는 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
읽어주셔서 감사합니다 :)
728x90
'SW개발 > Django' 카테고리의 다른 글
[Django]TIME_ZONE, USE_TZ 설정 (feat. 글로벌 서비스) (2) | 2022.11.15 |
---|---|
[Django]SetUpTestData의 격리 지원 (feat. Django > 3.2) (0) | 2022.08.02 |
[Django]DateField의 auto_now_add 옵션, 정확히 알아보기 (0) | 2022.07.31 |
[Django]Side effect 를 방지하는 테스트 코드 작성법 (0) | 2022.03.17 |
[Django]GenericForeignKey의 문제점 (feat. 안티패턴의 지름길) (0) | 2021.11.23 |