# 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 팔로우 기능 구현 (1) | 2023.10.17 |