본문 바로가기

프로그래밍/Django

[Django] get_or_create 함수

get_or_create

get_or_create

장고(Django)를 이용해 웹개발을 하다보면 종종 get_or_create라는 메서드를 마주치곤 한다.
이번 포스팅은 이 글을 참고해 작성했다.

get_or_create 메서드는 객체(object)를 조회할 때 유용하게 사용되는 메서드이다. 이 메서드는 (object, created) 라는 튜플 형식으로 반환을 한다. 첫번째 인자(object)는 우리가 꺼내려고 하는 모델의 인스턴스이고, 두번째 인자(created)는 boolean flag이다.

flag란, TRUE 또는 FALSE를 갖는 온오프 스위치라고 생각하면 된다. 딸깍하고 스위치를 키면 TRUE, 스위치를 끄면 FALSE이다.

아무래도 두번쨰 인자가 TRUE 또는 FALSE를 갖고 있으니 중요한 역할을 할 것이다.

  1. TRUE 라면 인스턴스가 get_or_create 메서드에 의해 생성되었다는 걸 의미한다.

  2. FALSE 라면 인스턴스가 데이터베이스에서 꺼내왔음을 의미한다. (즉, 기존에 있던 것임)

활용예제

설명을 했으니, 예제를 통해서 어떻게 활용할 수 있을지 살펴보도록 하자.

followis_follow = self.follow_relations.get_or_create(to_user=user)
    if not is_follow
        follow.delete()
    else:
        return follow

is_follow는 TRUE 또는 FALSE를 갖고 있는 flag이다.
is_followTRUE라면 팔로우되지 않은 상태이고 user를 팔로잉한다는 것을 의미한다. 

반대로, is_followFALSE라면 기존 DB에 이미 인스턴스가 이미 있다는 상태(즉, 이미 팔로잉 관계)를 의미한다.

is_followTRUE 또는 FALSE라는 값만을 가질 수 있다는 것을 생각하면 if not is_follow의 의미는 값이 FALSE라는 의미이며, if is_follow!와 같은 의미이다.


즉, 값이FALSE일때는 follow.delete()를 해줌으로써 언팔로우를 한다. 그 반대의 경우(즉, 처음으로 get_or_create 메서드에 의해 새로운 인스턴스가 만들어진 경우)라면 팔로우를 한다는 의미이다.