장고에서, 조건을 만족하는 오브젝트가 있으면 해당 오브젝트를 리턴하고, 없으면 404 처리를 하고 싶습니다. 이 때 저는 보통 어떻게 했냐면, exist 하지 않으면 404 response를 날리고, 아니면, 오브젝트르 가져와서 리턴했습니다. 그런데, 이를 좀 더 간단하게 처리해 줄 수 있는 함수가 있는데요. get_object_or_404입니다.

 


 먼저 post 모델은 위와 같습니다. 작성자인 user는 User를 참조하는 Foreign key를 들고 있습니다. 이 User는 장고에서 기본으로 제공되는 Auth의 User를 의미합니다. 다음에 post는 포스트 내용을 의미해요. 뭔가 네이밍이 이상한 것 같지만 넘어갑시다.

 

 

 Post 관련 admin View에서, 포스트를 쓴 유저 이름을 얻어오게 바꾸었습니다. get_username으로 바꾸었고, post 객체의 user의 유저 이름을 얻어오게끔 하였습니다.

 

 

 포스트는 총 3개가 있습니다. 작성자가 각각 cho, cho2, chokw3이네요.

 


 get_object_or_404에서 1번째 인자로 Post, 즉 모델을 넣었습니다. 이는 포스트 모델에서 뭔가를 필터링 걸어서 얻어오겠다는 의미입니다. 2번째 인자를 보면 user__username이라고 되어 있는데요. user 필드의 username이 "cho"인 post 객체를 얻어온다는 의미입니다.

 

 

 그랬더니, hi my name is cho 라는 포스트 내용 하나가 출력됩니다.

 

 

 설명을 보면, klass가 Model, Manager, Queryset이 될 수 있다고 합니다. 저는 이 중 klass를 넘겼고요. 다음에, get query에 쓸 키워드들을 넘겼는데요. 위에서는 user__username을 넘겼습니다. 이렇게 해서 get_object_xxx를 호출하는데 없으면, Http404 예외를 떨어트립니다. 이제 조금 더 복잡한 예를 봅시다.

 


 1번 포스트와 4번 포스트의 작성자가 "cho"에요. 작성자가 "cho"이고, post 내용이 정확하게 "nice"인 것만 얻어오고 싶습니다. 어떻게 하면 좋을까요? 함수 설명에, klass나 Queryset이나 매니저가 아닌 다른 인자들은 get에 filter로 걸 것들을 넘겨주면 된다고 했으므로, user__username과 post를 넘겨주면 됩니다.

 

 그러면 요래 작성하면 되겠군요.

 

 

 nice 하나가 잘 출력되었음을 알 수 있어요. 그런데, get_object_or_404는 결과가 2개 이상 나오면 multiple object returned 오류가 발생하는데요. 객체 하나가 아닌 리스트, 그러니까 객체들을 돌려주기 때문입니다. 설명에는 그리 나와 있는데, 정말 그런지 해 봐야 겠습니다.

 

 


 작성자 이름이 "cho"라는 필터만 걸고 index 메서드를 호출해 보겠습니다.

 

 

 어? 정말로 Multiple Object Returned가 뜨네요. 어떻게 해야 할까요? 결과가 여러 개 나오는 경우에는, get_object_or_404 대신에 get_list_or_404 함수를 쓰면 됩니다.

 

 

 사용법은 get_object_or_404와 같습니다. 다른 건, 아이템 하나가 아니라 아이템들의 리스트를 리턴한다는 것입니다. 따라서, 아이템들을 모두 얻어오려면 for 문으로 순회하는 수밖에 없습니다. 12번째 줄부터 13번째 줄이 그러한 일을 수행합니다.

 

 "cho"가 작성한 "nice"와, "hi my name is cho", 이렇게 2개가 잘 얻어와 졌음을 확인할 수 있습니다.