Meme's IT

[Django] 댓글 구현(N : 1) 본문

BackEnd/Django

[Django] 댓글 구현(N : 1)

Memez 2023. 10. 17. 11:57

# N : 1관계

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

댓글이 딱 N:1관계 → 글은 한개, 댓글은 N개가 달릴 수 있다

 

그럼... 한 댓글(comment model)이 있을 때, 얘가 어떤 article에 대한 댓글인지 어떻게 알 수 있을까?

ForeignKey()를 사용한다

 

 

# Foreignkey(외래키)란?

N:1 관계를 설정하는 모델 필드로, 두 관계를 엮어주는 역할. 

 

 


# 댓글 구현해보기

1. 댓글 model 만들기

# articles/models.py

class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  • ForeignKey() 클래스의 인스턴스 이름은 참조하는 모델 클래스 이름의 단수형으로 작성하는 것이 권장됨
  • ForeignKey 클래스는 작성 위치와 상관없이 테이블의 제일 마지막에 생성됨
  • on_delete: 외래 키가 참조하는 객체(article)이 사라졌을 때, 외래키를 가진 객체(comment)를 어떻게 처리할 것인지 정의하는 설정(데이터 무결성)
  • on_delete=models.CASCADE는 article이 삭제되면 comment도 삭제하는 옵션 → 나머지 옵션은 공식문서 참조

 

2. migration을 진행해준다. 

3. 댓글 만드는 법

# 댓글을 달 게시글 조회
article = Article.objects.get(pk=1)

# Comment 클래스의 인스턴스 comment 생성
comment = Comment()

# 댓글 내용 작성
comment.content = '첫번째 댓글'

# 이상태에서 저장하면 오류남 → 어디에 달릴 댓글인지를 안정해서
# 외래키 데이터를 입력해준다.
comment.article = article

comment.save()


# 클래스 변수명인 article로 참조하는 게시물 조회가능
comment.article.pk
=> 1

comment.article.content
=> 게시물의 내용 확인 등등...

 


 

아까 위에선 댓글→ 게시물이 어떤건지를 조회했는데,

반대로 게시물에서 댓글을 조회하려면?

 

# 역참조

N:1 관계에서 1에서 N을 참조하거나 조회하는 것

→ N(comment)는 외래 키를 가지고 있어 물리적으로 참조가 가능하지만

1(article)은 N에 대한 참조 방법이 존재하지 않아 별도의 역참조 이름이 필요하다

## related manager?

N:1 / M:N 관계에서 역참조 시에 사용하는 매니저

  • N:1 관계에서 생성되는 related manager의 이름은 "모델명_set"으로 만들어짐
  • 예를 들어서, 한 댓글의 해당하는 게시글은 comment.article이고
  • 그 게시글의 댓글 목록을 보고 싶다면 article.comment_set.all()으로 확인할 수 있음 

## 역참조 구현해보기

$ python manage.py shell_plus

article = Article.objects.get(pk=1)

article.comment_set.all()

'BackEnd > Django' 카테고리의 다른 글

[Django] RESTful API (1) URI과 URL  (0) 2023.10.18
[Django] API와 REST  (0) 2023.10.18
[Django] Query  (0) 2023.10.17
[Django] Fixtures  (0) 2023.10.17
[Django] N:M 팔로우 기능 구현  (0) 2023.10.17