View
발생상황
2차 프로젝트 진행 중, Kakao API를 통해 우리 사이트에 로그인한 사용자 중, user table에 없는 사용자는 API로부터 받아온 개인정보와 함께 user를 새로 데이터를 생성하기위한 로직을 짜고 싶었다.
내가 처음에 작성한 로직은 먼저 filter를 통해 조회를 한 뒤, create로 user를 생성을 해주는 방식이었다.
(현재는 다른팀 멘토이신) 수진 멘토님께서 우연히 지나가시다 내 자리에 들르셨다. 멘토님과 프로젝트 관련 이런저런 이야기를 나누다가
내가 짠 코드를 보여드리게 되었다.
멘토님은 조회와, 생성을 한꺼번에 할수 있는 방법이 있으니, 찾아보고 적용해 볼것을 조언해주셨다.
그리곤 곧장 구글과 장고 공식문서를 뒤져 방법을 찾고 적용해보았다.
적용방법
get_or_create 메서드 사용
- 이 메서드는 객체(object)를 조회할 때 유용하게 사용되는 메서드이다.
- 반환형식 : (object, created) 튜플 형식
- 첫번째 인자(object) : 우리가 꺼내려고 하는 모델의 인스턴스
- 두번째 인자(created) : boolean flag
flag란, TRUE 또는 FALSE를 갖는 온오프 스위치라고 생각하면 된다. 딸깍하고 스위치를 키면 TRUE, 스위치를 끄면 FALSE이다.
아무래도 두번쨰 인자가 TRUE 또는 FALSE를 갖고 있으니 중요한 역할을 할 것이다.
- TRUE 라면 인스턴스가 get_or_create 메서드에 의해 생성되었다는 걸 의미한다.
- FALSE 라면 인스턴스가 데이터베이스에서 꺼내왔음을 의미한다. (즉, 기존에 있던 것임)
get_or_create 사용 전
if not User.objects.filter(kakao_id=kako_id).exists():
User.objects.create(
kakao_id = 123,
nickname = "melody",
email = "melody@story.com",
image_url = "http://asdfasdf.jpg"
)
get_or_create 사용 후
user, created = User.objects.get_or_create(
kakao_id = 123,
defaults ={
'nickname' : "melody",
'email' : "melody@story.com",
'image_url' : "http://asdfasdf.jpg"
}
)
👉 조건문 없이, 메소드 하나로 모든것을 해결!!!!!!
get_or_create 의 활용 : follow & unfollow
follow, is_follow = self.follow_relations.get_or_create(to_user=user)
if not is_follow: # False면 get 되었다는 뜻
follow.delete() # 팔로우를 하고있으면, 그 사람을 언팔하겠다.
else: # True면 create 되었다는 뜻
return follow # 언팔을 하고있으면, 팔로우를 하고 내가 팔로우하는 사람을 반환.
Thinking Melody
get_or_create메소드를 통해서 django의 다양한 QuerySet API에 대해 살펴볼수있었다.
QuerySet API를 더 공부하여, 2차 프로젝트 진행기간동안 보다 간결하고 가독성 높은 로직을 작성하는데에 적용해보아야겠다.
화이팅!!
https://docs.djangoproject.com/en/3.2/ref/models/querysets/
'Django' 카테고리의 다른 글
TIL 36 | Session_Django_초기세팅 (0) | 2021.08.12 |
---|---|
TIL 30 | Django_Polls만들기_Part1 (0) | 2021.08.10 |