본문 바로가기

기술

[Django / DRF] Nested 구조의 모델 다루기

장고를 하다보면 nested 구조의 모델들을 다루게 될 때가 많다. 특히, 이번에 음식점 리뷰와 관련한 백엔드 API를 작성하는 프로젝트 진행하였는데, 굉장히 깊은 nested 구조를 다루게 되었다. 따라서 본 포스팅에서 nested 구조를 쉽게 처리할 수 있는 방법들을 소개하고자 한다.

프로젝트 개요 설명

모든 코드는 github에서 볼 수 있다.

https://github.com/seonkyuKim/manage_web_docker_compose

 

seonkyuKim/manage_web_docker_compose

Contribute to seonkyuKim/manage_web_docker_compose development by creating an account on GitHub.

github.com

리뷰어(reviewer) : 음식점들을 돌아다니며 리뷰를 작성하는 사람들이다. 리뷰어들은 여러 개의 리뷰를 작성할 수 있다.

리뷰(review) : 음식점에 대한 리뷰이다. 하나의 리뷰에는 여러 가지 메뉴를 리뷰할 수 있다.

메뉴(menu) : 메뉴 종류에는 일반메뉴, 세트메뉴, 뷔페메뉴가 있다. 이때, 세트메뉴와 뷔페메뉴에는 여러 음식을 리뷰할 수 있다.

음식(food) : 리뷰 안의 가장 작은 단위이다.

 

만약, '황제펭귄' 리뷰어가 쿠우쿠우에 가서 '연어초밥'과 '장어초밥'을 먹고 리뷰를 작성했다면 그 구조는 다음과 같다.

 

황제펭귄
├── 쿠우쿠우 리뷰
├───── └── 뷔페메뉴 
├──────────── └── 연어초밥
├──────────── └── 장어초밥
├── 김밥천국 리뷰
└── ...

Django Nested Admin

위와 같은 nested 구조의 데이터를 관리할 때 Admin 사이트에서 문제를 겪게 된다. 기본 장고 admin에서 InlineModelAdmin이 있지만 이는 한 단계의 nested 구조만을 지원한다. 위처럼 깊은 nested 구조는 지원이 안 된다. 이때 사용할 수 있는 것이 django-nested-admin이다. 사용하기 편리하게 잘 되어있다.

https://github.com/theatlantic/django-nested-admin

 

theatlantic/django-nested-admin

Django admin classes that allow for nested inlines - theatlantic/django-nested-admin

github.com

DRF Writable Nested Model Serializer

Django REST framework로 개발을 하다보면 nested 모델 구조는 지옥을 맞보게 된다. DRF 공식 문서에 따르면, nested model serializer의 create()와 update()는 직접 구현을 해야한다. 다행히, 정말 다행히도, 이미 누군가가 개발해주셨다. 필자는 이 패키지 덕분에 100줄 넘는 코드가 사라지게 되었다.

https://github.com/beda-software/drf-writable-nested

 

beda-software/drf-writable-nested

Writable nested model serializer for Django REST Framework - beda-software/drf-writable-nested

github.com

하지만 이 패키지 역시 완전하지는 않다. multipart PATCH 요청을 보내면 이전 데이터가 사라지는 등의 문제가 있다. Github의 Issues를 확인해보는 것이 좋을 것 같다.