Django_10) Many to one relationships 1

지비지비집·2023년 11월 6일
0

Django

목록 보기
10/14
post-thumbnail

Django를 통해 현재 게시글에 대한 CRUD, 유저에 대한 CRUD, 로그인/로그아웃, 권한설정까지 공부해보았다. SQL 공부를 하면서 이를 Django에 접목시켜 데이터간의 관계를 분석해보고, 댓글 기능을 구현해보자.

Many to one relationships(N:1 or 1:N)

한 테이블의 0개 이상의 레코드가 다른 테이블의 레코드 한 개와 관련된 관계

하나의 게시글에 여러 댓글이 작성될 수 있을테니 게시글과 댓글의 관계는 1:N 관계일 것이다. 댓글에 대한 App을 만든다고 할 때, 게시글과 똑같이 구성하면 될까? DB 기준으로 어떤 field가 달라질까? 하나씩 생각해보자. (제목) -> 댓글에 얘는 굳이 필요 없을 것 같다. (내용) -> 그대로 유지, (created_at) -> 그대로 유지, (updated_at) -> 그대로 유지. 그다음 추가할 내용을 고려해보면 우리는 댓글마다 어떤 게시글에 대한 댓글인지를 알려주는 데이터가 필요해 보인다. 이를 그림으로 확인해보면 아래와 같다.

Comment 기능 구현

  1. articles/models.py에 Comment class 생성

ForeignKey(to, on_delete)

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 에 해당하는 것

  1. Comment Create 구현
    1. 사용자로부터 댓글 데이터를 받기 위한 CommentForm 정의
    1. detail view 함수에서 CommentForm을 사용하여 렌더링
    1. CommentForm의 출력 필드 조정
    1. urls, detail.html 작성
    1. view 함수 작성

      -> 아래서 comment와 article을 사용하기 위해 저장하기 전에 commit=False를 사용 하여 변수에 담을 수 있도록 함.
  1. Comment Read 구현

  1. Comment Delete 구현


    업로드중..
    <참고> 삭제에서는 idx가 2개 필요하다. (몇 번 게시글의, 몇 번 댓글을 삭제)
profile
"정말 무엇인가를 이해한다면 전문용어를 모르는 사람에게도 설명할 수 있어야 한다." -리처드 파인만-

0개의 댓글