1. Foreign Key
- 다른 테이블의 특정 레코드를 참조하고 있는 필드
- 외래키(Foregn Key)를 가지고 있는 테이블을 자식 테이블 (Child Table)이라고 함
- 외래키(Foregn Key)에 의해 참조 되는 테이블을 부모 테이블(Parent Table)이라고 함
- 대표적으로 본문/댓글의 관계가 있음. 만약 본문의 댓글 수에 제한이 있다면 댓글1, 댓글2와 같이 독립적인 필드를 만들어 주면되지만, 실제로는 본문에 몇개의 댓글이 달릴지 모름. 따라서 Foreign key로 댓글 테이블이 자식 테이블로 들어가야 함.
class Board(models.Model):
pass
class Reply(models.Model):
b = models.ForeignKey(Board, on_delete=models.CASCADE)
....
- 위 코드의 예에서 Board는 부모테이블, Reply는 자식테이블 된다.
- Foreign Key의 인자로는 참조하려는 테이블과, on_delete 속성 임.
- on_delete는 부모가 삭제되었을때 어떻게 해당 레코드를 처리할 것인가를 정해주는 속성으로 대부분 부모가 삭제되면 함께 제거되는 CASCADE를 사용함. 이 외에 부모 삭제시 null 메꾸는 처리도 있음
2. 부모테이블에서의 자식 테이블 호출
- 부모테이블 입장에서는 자식테이블이 갑자기 생긴 것이지만 , 레코드에 맞춰 자식테이블을 호출할 수 있음
- "자식테이블_set"라는 역참조를 할 수 있는 기능이 생긴 것임
- 아래 코드에서는 r에는 bpk라는 id를 갖는 본문 b에 달려있는 모든 reply가 담기게 됨
def detail(request, bpk):
b = Board.objects.get(id=bpk)
r = b.reply_set.all()
...
3. 게시판 APP분석
- 외래키의 대표적인 사용처로 게시판 App이 있음. "등록사용자"⊃"글쓴이", "게시글"⊃"댓글" 관계를 만들어 줄 때 사용
- Board 테이블에서는 acc.models 로 부터 User 테이블을 가지고와서 writer의 부모 테이블로 관계를 맺어줌. 즉 writer는 계정에 등록된 사용자만 될 수 있음
- Reply 테이블에서는 b가 Board 테이블의 자식테이블이 되고, replyer는 User테이블의 자식 테이블이 됨.
'웹개발 > 장고 (Django)' 카테고리의 다른 글
#7_서버/클라이언트 간 데이터 전송 (0) | 2022.06.25 |
---|---|
#6_Admin 사이트 테이블 등록, 관리자 계정 생성, HTML데이터 전달 (0) | 2022.06.25 |
#5_Model(DB) (0) | 2022.06.25 |
#4_HTML 기초 (0) | 2022.06.25 |
#3_Client에 응답 보내기 (feat. MTV분리) (0) | 2022.06.25 |