2019.07.06 filter기능에서 한번에 user_id 걸기
문제의 시작
- Connect 프로젝트의 오늘 연락할 인맥에 사람이 안나오기 시작했다.
- 매일 5명이 보여져야 하는데(만약에 연락해야 될 사람들이 있다면) 어느 순간 연락해야 할 사람이 5명이 넘는데도, 그렇게 나오지 않는 문제가 발생했다.
- filter기능을 통해 정확히 DB에서 가지고 오는데 forloop.counter <= 5를 설정해주었는데 왜 이 for문이 제대로 작동하지 않는지 이해가 되지 않았다.
해결을 위한 방법
- 먼저 데이터가 잘 넘어가고 있는지에 대한 의문이 들었다.
- 내가 뷰에서 작업한 화면이었고
- 내가 템플릿에서 작업한 화면이었다.(원래는 forloop.counter가 5명이었으나 10명으로 늘려서 또 실험해보았다.)
- 1명 나오던 것이 10명으로 늘리니 3명이 화면에 나왔다.
- 무언가 object_list를 가지고 오는데 문제가 있다고 생각하였다.
- 그렇게 나는 print를 통해 화면을 찍어보았다.
- 뷰에서 context에 들어간 object_list에 대해서 얼마나 많은 데이터가 들어가 있는지 확인해보았다.
- 나에게 넘어와야 할 데이터는 14명이었는데 34명이 들어가 있었다.
- 그리고 여기서 넘어 온 데이터가 template에서 for문을 돌면서 나오고 있었는데, 문제점은 바로 템플릿에서의
- 이 부분 이었다. 넘어온 object_list에서 해당 로그인한 사람의 아이디를 통해 한번 더 필터링 하였고, 그 정보에서 forloop.counter를 하니 사이사이에 다른 사람들의 friend가 들어오는 것이 문제였다.
- view의 로직에서 처리해줄 방법이 필요했다.
- 먼저 애초에 Friend에 대해 해당 user의 Friend만 넘겨주고
- 또 forloop.counter가 아닌 객체 5개만을 넘겨주면 저 해당 코드 2줄을 깔끔하게 지울 수 있었다.
해결
- filter 내부에 user_id =self.request.user.id를 추가하여 해당 Friend를 가지고 올 떄 한번 더 해당 user에 대해서 filter하도록 추가하였다.(굉장히 단순한 코드인데… 해결 방법을 알았음에도 어떻게 코드를 쳐야 할지 굉장히 고민하였다.)
- 그리고 그렇게 filter된 값에 [:5] 인덱스를 이렇게 설정해줌으로서 5개만 가지고 오게 하였고
- 해당 결과 print를 해보니 5명이 잘 넘어오는 것을 확인할 수 있었다.
개선 사항
- 기존에 발생하였던 문제를 해결하였고
- 기존에는 모든 사람들에게서 scheduled_connect가 오늘 날짜를 지난 사람들은 다 보내준 후에 template에서 랜더링 하였으나, 해당 문제에 대해서 view에서 처리하게 됨으로서 template 랜더링 시간이 훨씬 개선 되었을 거라 생각된다.