본문 바로가기
프로젝트/Django - How Dimt?

Django poj.c B10) get_or_create !! - 18일차

by Fola 2022. 5. 6.

Code B Django 10번 글, 프로젝트 18일차 (목)

 


get_or_create()

get_or_create(defaults=None, **kwargs)

A convenience method for looking up an object with the given kwargs (may be empty if your model has defaults for all fields), creating one if necessary.

Returns a tuple of (object, created), where object is the retrieved or created object and created is a boolean specifying whether a new object was created.

 

Reference: 

https://docs.djangoproject.com/en/4.0/ref/models/querysets/

 


 

 

 

1. 

CBV는 웬만하면 안 쓰기로 했다.

기본 기능 이외의 어떠한 로직도 추가하는 방법을 쉽게 찾을 수가 없다.

나중에 프런트 신경 안 써도 되는 Restful API 서버 만들 때나 다시 찾아봐야지.

 

 

 

 

 

 

2.

Profile 모델 안에 닉네임, 소개글, 벽지와 프로필 이미지 등을 담는 로직을 짜고 있다.

 

 

 

Django User 모델과 내가 만든 Profile 모델을 OneToOneField로 연결시켰다.

DB를 열어보고 알게 되었는데, OneToOneField로 연결하고 마이그레이션 해도

새로 연결된 Profile 모델에 User에 1대 1 대응하는 객체는 자동으로 만들어지지 않는다.

 

User 객체와 연결된 Profile 객체를 만들기 위해선 User 모델의 pk가 필요했다.

pk 얻는 방법에서 막혔다.

 

처음엔  post 메서드로 로그인된 유저 모델의 객체를 함수로 던질까 생각을 하다가

아무리 생각해도 너무 비효율적인 것 같아서 한참을 고민해서 답을 찾았다.

 

profile_update 함수를 호출할 때 get 방식으로 username을 주소에 담아 넘겼는데

이 username을 이용해서 현재 로그인된 user 객체를 가져왔다.

 

logged_user = get_object_or_404(User, username=user_username)

 

두 번째는 OneToOneField로 연결된 객체가 존재하는지 먼저 확인하고 객체를 생성하는 로직이었다.

코드를 작성하는 중에 파이참의 자동완성으로 get_or_create를 보았고 느낌이 왔다.

딱 봐도 내가 원하는 함수다.

일단 얻으려고 시도하고 없으면 생성한다.

 

공식 문서에서 활용 방법을 찾았고 간단하게 해결되었다.

 

get_or_create()는 (object, boolean) 튜플 형식을 반환한다.

없으면 생성하니 어찌 되었든 객체는 반환되고

만약 객체가 생성되었다면 튜플의 두 번째 인자로 True를 반환한다.

 

own_profile, is_created = Profile.objects.get_or_create(user_id=logged_user.id)

 

 

 

 

 

 

3.

 

문제점 1 )

profile_update 함수 하나로 profile를 업데이트할 수 있는 페이지 로드와

POST method에 담겨 온 정보로 DB 업데이트를 한 번에 처리해볼 생각이었는데, 잘 작동하지 않았다.

update 페이지를 로드하는 함수와 업데이트 로직을 처리하는 함수 두 개로 분리할 예정이다.

( 어제 일이라 왜 잘 작동하지 않았는지 기억이 나지 않는다. 이래서 기록이 중요한 건데ㅠ)

 

문제점 2)

업데이트하려는 Profile 객체를 단순히 get 호출의 username 주소로부터 가져오기 때문에

현재 로직대로면 프로필의 주인이 아닌 사람도 수정이 가능해진다.

수정하려는 객체와 로그인 유저가 일치하는지 확인하는 코드가 필요하다. 

 

 

 

 

댓글