DRF+React로 Blog(유사 velog) 만들어보기 (3) 게시글 관련 모델 만들기

HEYDAY7·2021년 4월 17일
0
post-thumbnail

이 글은 board/models.py안에 코드를 작성한다!

먼저 게시글 관련해서 어떤 모델들을 만들지를 구상하자.

  • Post : 게시글
  • Comment : 댓글
  • Series : velog에 존재하는 series!!

기본 base로 이렇게 3가지가 있을 것 같다.

모델 작성에 있어 모르는 field가 등장한다면 공식문서 를 참조하자!!! 공식문서는 대부분의 경우 해답을 제공한다.

Post

우선 코드를 써보자면 아래와 같다. 처음으로 만드는 model이니 Post의 경우 최대한 자세하게 설명하겠다.

field를 하나씩 알아보자
우선 Post model 자체가 갖게될 field는 다음과 같다.


  • title : 제목
    CharField로 나타내며, CharField의 경우 max_length를 지정해줘야한다!!

  • content : 내용
    본문의 내용의 경우 길이 제한이 없는게 자연스러움으로 TextField를 사용한다!

  • created_at : 최초 작성된 시간
    DateTimeField를 사용한다!! auto_now_add=True를 사용할 경우 글이 작성된 시점의 시간을 알아서 저장해준다.

  • updated_at : 최근 수정된 시간
    동일하게 DateTimeField를 사용해준다. 그러나 auto_now_add가 아닌 auto_now를 True로 지정해준다. 이로써 수정이 일어날 때 마다 그 순간의 시간을 저장해준다.

이후는 다른 Model과의 관계가 있을 field이다

이 부분에 들어가기 위해선 RDB의 개념을 이해하고 있어야 한다! 이 내용은 짧게 다른 글에서 정리할 것이다. 다른 모델과의 관계를 나타내기 위해선 ForeignKey을 사용하고 자세한 내용은 ForeignKey를 참고하면 된다.

쉽게 설명하자면 각 model 별로 data가 기록된 table이 각각 있는데, 두 table 사이의 링크를 놔주는 것이다. A라는 유저가 B라는 글을 작성한다면, B 글의 데이터에 작성자가 A이며, A 유저의 데이터를 어떻게 찾을 수 있는지 방식을 제시해 주는 느낌이다.

models.ForeignKey([모델이름], on_delete=?, related_names='')

당연하겠지만 모델이름은 연결되는 모델이름일 것이고, on_delete는 연결된 object가 삭제되었을 때의 처리를 나타내며, related_names는 연결된 object에서의 접근에 사용되는 키워드다.
아래서 실제 예시를 보며 익숙해지자.

series : 어떤 시리즈에 속하는지를 연결해준다.

'Series'모델을 연결해준다.
series가 없어도 post는 존재할 수 있으므로, 삭제될 경우 null이 할당되도록 SET_NULL로 설정한다. 즉 연결된 series가 삭제되면 post.series 는 null 값이 채워진다.
related_names의 경우 posts로 series.posts를 통해 series에 등록된 post들을 확인할 수 있다.
related_query_name의 경우 Django ORM에서 filtering을 할 때 사용되는 name이다.


user : 글의 작성자가 누구인지

User 모델을 연결해준다. 여기서 'series'와 달리 string으로 넣지 않은 것을 볼 수 있다. 그 이유는 User model을 알고 있기 때문이다. 코드의 맨 위를 보면 User를 import 해오는 것을 볼 수 있는데, 이는 Django의 기본 User model을 사용하는 것이고, 결국 User model을 알기에 변수식으로 모델을 설정하는 것이다. 'Series'의 경우 아직 Series 모델이 정의되지 않았기에 string으로 나타낸 것이다.
on_delete는 cascade이다. 즉 User가 삭제되면 글도 삭제된다.


comment : 게시글에 달린 댓글!

comment의 경우 위 model에서 관련 코드를 찾아볼 수 없다. 그 이유는 foreign key 의 1:N의 관계 때문이다. 위에 적힌 post-series, post-user의 경우 series 하나에 post가 여러개 속할 수 있고, 또 user 한명이 post를 여러개 적을 수 있는, 즉 post가 1:N에서 N인 case이다. 이럴 경우 model 코드 작성시 N 쪽에서 foreignkey field를 만드는 것이 일반적이다.
즉 comment의 경우 comment model 코드에 post가 foreignkey field로 등장할 것이다!


추가적으로 str 함수가 정의된 것을 볼 수 있다. 이것은 간단히 말해 model object의 이름표 같은 느낌이다. Django shell을 통해 model 값을 접근해보면 이를 알 수 있다. 이 함수를 사용하면 할당된 값으로 object가 나타나고, 아닐 경우 pk를 통해 표현된다.(사진 넣으면 좋을 듯)

Comment

이제부턴 핵심만 짚어가며 넘어가겠다


  • content : post와 동일

  • created_at : post와 동일

  • user : post와 동일
    user.comments를 통해서 user는 자기가 작성한 comments 들에 접근할 수 있을 것이다.

  • post : 이 부분이 위에서 언급했던 부분이다. post-comment의 1:N 관계에서는 comment과 N side 이기 때문에 comment에서 ForeignKey field를 만들어준다.

Series

series의 경우 매우 간단하다.


  • name : series의 이름을 말한다. 동일한 이름의 series가 생기지 않도록 unique=True를 넣어준다

  • updated_at: post와 동일

이렇게 Series model 코드가 간단하게 표현되는 이유는 애초에 필요한 데이터가 적기도 하지만, 1:N relation이 Post 쪽에서 표현되었기 때문이다!


마무리

이렇게 세가지 model 코드를 작성해봤다. 다음 글에서는 model을 만들고 사용하는데 기초가 되는 구현인 model의 CRUD에 대해 진행해보겠다.

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글