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에 저장하지 않고 인스턴스만 반환하는 옵션
저장할 인스턴스에 필요한 조치를 할 수 있는 틈, 시간을 마련해주는 용도!
- 댓글 개수 출력하기
- DTL filter - ‘ length ‘ 사용
ex) { { comments | length } } or { { article.comment_set.all | length } } - QuerySet API - ‘ count( ) ‘ 사용
ex) { { article.comment_set.count } }