[Django]get_or_create() 란?

2022. 8. 1. 18:17·SW개발/Django

이번 포스팅에서는 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

'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
'SW개발/Django' 카테고리의 다른 글
  • [Django]TIME_ZONE, USE_TZ 설정 (feat. 글로벌 서비스)
  • [Django]SetUpTestData의 격리 지원 (feat. Django > 3.2)
  • [Django]DateField의 auto_now_add 옵션, 정확히 알아보기
  • [Django]Side effect 를 방지하는 테스트 코드 작성법
Leffe_pt
Leffe_pt
개발자로서 성장하면서 배워온 지식과 경험을 공유하는 공간입니다.
  • Leffe_pt
    Leffe's tistory
    Leffe_pt
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • SW개발 (303)
        • 코딩테스트 (172)
        • 개발이야기 (23)
        • IT 용어 (17)
        • Python (22)
        • Django (46)
        • Flask (2)
        • Database (1)
        • SQLAlchemy (0)
        • Javascript (5)
        • Linux, Unix (3)
        • JAVA (2)
        • Spring (10)
      • 회고 (4)
      • 사진 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    g
    음식
    라이프 스타일
    트리 #AVL #알고리즘 #자료구조
    플레이스토어
    배공파용
    django
    배달비 공유
    컨트리뷰터
    오픈소스
    어플리케이션
    배달
    Contributor
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Leffe_pt
[Django]get_or_create() 란?
상단으로

티스토리툴바