장고를 하다보면 nested 구조의 모델들을 다루게 될 때가 많다. 특히, 이번에 음식점 리뷰와 관련한 백엔드 API를 작성하는 프로젝트 진행하였는데, 굉장히 깊은 nested 구조를 다루게 되었다. 따라서 본 포스팅에서 nested 구조를 쉽게 처리할 수 있는 방법들을 소개하고자 한다.
프로젝트 개요 설명
모든 코드는 github에서 볼 수 있다.
https://github.com/seonkyuKim/manage_web_docker_compose
리뷰어(reviewer) : 음식점들을 돌아다니며 리뷰를 작성하는 사람들이다. 리뷰어들은 여러 개의 리뷰를 작성할 수 있다.
리뷰(review) : 음식점에 대한 리뷰이다. 하나의 리뷰에는 여러 가지 메뉴를 리뷰할 수 있다.
메뉴(menu) : 메뉴 종류에는 일반메뉴, 세트메뉴, 뷔페메뉴가 있다. 이때, 세트메뉴와 뷔페메뉴에는 여러 음식을 리뷰할 수 있다.
음식(food) : 리뷰 안의 가장 작은 단위이다.
만약, '황제펭귄' 리뷰어가 쿠우쿠우에 가서 '연어초밥'과 '장어초밥'을 먹고 리뷰를 작성했다면 그 구조는 다음과 같다.
황제펭귄
├── 쿠우쿠우 리뷰
├───── └── 뷔페메뉴
├──────────── └── 연어초밥
├──────────── └── 장어초밥
├── 김밥천국 리뷰
└── ...
Django Nested Admin
위와 같은 nested 구조의 데이터를 관리할 때 Admin 사이트에서 문제를 겪게 된다. 기본 장고 admin에서 InlineModelAdmin이 있지만 이는 한 단계의 nested 구조만을 지원한다. 위처럼 깊은 nested 구조는 지원이 안 된다. 이때 사용할 수 있는 것이 django-nested-admin이다. 사용하기 편리하게 잘 되어있다.
https://github.com/theatlantic/django-nested-admin
DRF Writable Nested Model Serializer
Django REST framework로 개발을 하다보면 nested 모델 구조는 지옥을 맞보게 된다. DRF 공식 문서에 따르면, nested model serializer의 create()와 update()는 직접 구현을 해야한다. 다행히, 정말 다행히도, 이미 누군가가 개발해주셨다. 필자는 이 패키지 덕분에 100줄 넘는 코드가 사라지게 되었다.
https://github.com/beda-software/drf-writable-nested
하지만 이 패키지 역시 완전하지는 않다. multipart PATCH 요청을 보내면 이전 데이터가 사라지는 등의 문제가 있다. Github의 Issues를 확인해보는 것이 좋을 것 같다.
'기술' 카테고리의 다른 글
[Django] 파일 저장 경로 지정 (0) | 2019.09.10 |
---|---|
[Django] AWS RDS + Django 데이터베이스 설정 (0) | 2019.09.10 |
[Django] 유용한 Django Admin Tips! (0) | 2019.09.10 |
[Django] 장고 튜토리얼 공부 추천 순서 (0) | 2019.09.09 |
기술 블로그를 시작하며 (0) | 2019.09.06 |