200804 TIL

rang-dev·2020년 8월 4일
0

Wecode-TIL

목록 보기
69/79

200804 (화)

  • 대시보드 View 수정
    • 어제 코드리뷰를 하다가 대시보드 view에서 aggregation, annotation을 사용해보면 코드가 엄청 간단해질 것 같아서 오늘 시도를 해보았다.
    • 그 전에 DeliveryInfo 모델에서 cusotmer_ids라는 customer id의 리스트의 length를 quantity라는 필드에 넣어야하는데 필드에 len(customer_ids)가 바로 적용이 안되어서 처음으로 Manager 클래스를 만들어서 사용해보았다.
    • quantity 문제를 해결하니 이제 annotation과 aggregation을 시도해볼 수 있었다. 얼핏 봤을때는 둘의 차이를 잘 몰랐었는데 오늘 계속 테스트해보면서 그 차이점을 알게되었다. annotation은 기준에 따라 그룹화를 하여 그룹끼리의 값을 계산하는 것이고, aggregation은 모든 행들을 다 포함하는 것이다. RACCOONY님의 블로그 글이 도움이 많이 되었다.
    • 해야하는 것은 해당 날짜의 총 배송지 수 / 배송할 박스 수(=고객 수) / 완료된 박스 수와 이 값들을 또 각 기사님별로도 나타내는 것이었다.
    • 여기서 완료된 박스 수를 구하는게 가장 어려웠다. 배송지 수와 박스 수는 annoation으로 한번에 같이 구할 수 있었는데 완료된 배송지는 is_done에 따라 다르기 때문에 filter를 넣어주거나 그룹화를 따로 해주어야 한다고 생각했었다. 만약 이렇게 따로 구하게되면 나중에 하나로 합쳐주는 과정이 또 발생하고(serializer로 한번에 보내주고 싶었다.) 더 번거로워지기 때문에 어떻게하면 annoation 한번에 값을 다 구할 수 있을지 생각했다. 생각해보니 is_done이 True이면 값을 1로 볼 수 있고, False이면 0으로 볼 수 있다. 이 값을 각각 quantity와 곱해서 sum을 하면 False인 값은 무시되고 True인 quantity만 더해지니 배송이 완료된 박스수가 나오는 것이다. 알고나면 간단한데 이 생각을 하기까지 각각 만들어진 쿼리끼리 합쳐보겠다고 난리도 아니었다.💦 이 방법을 알고나니 모든 배송에 대한 각 값들을 구하는 것은 매우 수월하게 끝낼 수 있었다.👏🏻
  • 아래의 코드에 사용된 F()는 DB에 있는 필드의 value를 파이썬 메모리로 가져오지 않고 바로 참조하여 사용할 수 있게 해준다고 한다.
    30줄이 넘었었던 코드가 깔끔하게 변했다.
  • 면접 질문 정리
    • 면접 스터디에서 각자 질문을 맡아서 답을 알아오기로 했다.
    • 오늘 정리한 질문: Python의 타입 관리 방식, DBMS
  • Udemy DRF 강의 듣기
profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢

0개의 댓글