Django를 통해 현재 게시글에 대한 CRUD, 유저에 대한 CRUD, 로그인/로그아웃, 권한설정까지 공부해보았다. SQL 공부를 하면서 이를 Django에 접목시켜 데이터간의 관계를 분석해보고, 댓글 기능을 구현해보자.
한 테이블의 0개 이상의 레코드가 다른 테이블의 레코드 한 개와 관련된 관계
하나의 게시글에 여러 댓글이 작성될 수 있을테니 게시글과 댓글의 관계는 1:N 관계일 것이다. 댓글에 대한 App을 만든다고 할 때, 게시글과 똑같이 구성하면 될까? DB 기준으로 어떤 field가 달라질까? 하나씩 생각해보자. (제목) -> 댓글에 얘는 굳이 필요 없을 것 같다. (내용) -> 그대로 유지, (created_at) -> 그대로 유지, (updated_at) -> 그대로 유지. 그다음 추가할 내용을 고려해보면 우리는 댓글마다 어떤 게시글에 대한 댓글인지를 알려주는 데이터가 필요해 보인다. 이를 그림으로 확인해보면 아래와 같다.
N:1 관계 설정 모델 필드
to는 참조하는 객체, on_delete는 참조하는 객체가 사라졌을 때, 외래키를 가진 객체를 어떻게 처리할 지를 정의하는 설정(데이터 무결성)
App을 분리하지말고 articles에 댓글 기능을 넣어야 참조를 쉽게 할 수 있을 것 같다.
CASCADE는 같이 사라지게 한다는 의미이다.
model이 변경되었으니 migration 과정을 거치도록 하자.
참조 : N:1 관계에서 N의 입장에서 1에 대한 정보를 받아오는 것
-> comment.objects.get(pk=?) / comment.article.pk / comment.article.title / ...
역참조 : N:1 관계에서 1의 입장에서 N에 대한 정보를 받아오는 것
-> article.comment_set.all() 으로만 가능한데 QuerySet의 형태로 받아옴
N:1 혹은 M:N 관계에서 역참조 시에 사용하는 매니저
objects 나 comment_set 에 해당하는 것