Web, Django, DB

DB : Many to one relationships

Disciple428 2024. 4. 3. 15:05
  • N : 1 or 1 : N

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

ex) Comment(N) - Article(1) ⇒ 0개 이상의 댓글이 1개의 게시글에 작성될 수 있다.

 

  • ForeignKey( )

N : 1 관계 설정 모델 필드

N : 1 관계에서 외래 키는 N 쪽에서 가지고 있다!

 

  • 댓글 모델 정의

ForeignKey 클래스의 인스턴스 이름은 참조하는 모델 클래스 이름의 단수형으로 작성하는 것을 권장한다.

외래 키는 ForeignKey 클래스를 작성하는 위치와 관계없이 테이블 필드 마지막에 생성된다.

 

  • ForeignKey(to, on_delete)

to → 참조하는 모델 Class 이름

on_delete → 참조하는 객체가 사라졌을 때, 이 객체를 어떻게 처리할 지 정의하는 설정 (데이터 무결성)

 

  • 역참조

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

⇒ 외래키를 갖고 있지 않은 쪽에서 외래키를 갖고 있는 쪽을 참조하는 것

N 은 외래 키를 가지고 있기에 자연스럽게 참조가 가능하지만, 1은 N에 대한 참조 방법이 존재하지 않아 별도의 역참조 기능이 필요하다.

ex)

article.comment_set.all( ) → 특정 게시글에 작성된 댓글 전체를 조회하는 명령

(related manager = 역참조 이름 ⇒ 외래 키를 가지고 있는 관련 클래스 이름(모델명)을 소문자로 바꿔서 _set 과 함께 구성한다)

 

  • save(commit = False)

DB에 저장하지 않고 인스턴스만 반환하는 옵션

저장할 인스턴스에 필요한 조치를 할 수 있는 틈, 시간을 마련해주는 용도!

 

  • 댓글 개수 출력하기
  1. DTL filter - ‘ length ‘ 사용
    ex) { { comments | length } } or { { article.comment_set.all | length } }
  2. QuerySet API - ‘ count( ) ‘ 사용
    ex) { { article.comment_set.count } }