Foreign Key
- 외래 키(외부 키)
- 관계형 DB에서 다른 테이블의 행을 식별할 수 있는 키
- 참조되는 테이블의 기본 키를 가리킴(외래키의 값이 반드시 부모 테이블의 기본 키일 필요는 없지만 유일한 값이어야 함 - 참조 무결성)
- 참조무결성? DB 관계모델에서 관련된 2개의 테이블 간의 일관성을 말함
- 외래키가 선언된 테이블의 외래키 속성의 값은 그 테이블의 부모가 되는 테이블의 기본 키 값으로 존재해야 함
- 참조하는 테이블의 행 1개의 값은, 참조되는 측 테이블의 행 값에 대응됨
- 이 때문에 참조하는 테이블의 행에는, 참조되는 테이블에 나타나지 않는 값을 포함할 수 없음
- 참조하는 테이블 행 여러 개가 참조되는 테이블의 동일한 행을 참조할 수 있음
N:1 (Comment(N) : Article(1))
- Comment 모델과 Article 모델 간 관계 설정
- n개 이상의 댓글은 1개의 게시글에 작성될 수 있음
월요일 교재 22p 사진 삽입
- Django Relationship fields
- OneToOneField() : A one to one relationship
- ForeignKey() : A many to one relationship
- N:1을 담당하는 django의 모델 피드 클래스
- 외래키 속성을 담당
- 2개의 필수 위치 인자 필요
- 참조하는 model class
- on delete 옵션
- ManyToManyField() : A many to many relationship
파일 경로 ==> articles/models.py
- 외래 키 필드는 ForeignKey 클래스를 작성하는 위치와 관계없이 필드의 마지막에 작성됨
- ForeignKey() 클래스의 인스턴스 이름은 참조하는 모델 클래스 이름의 단수형(소문자)로 작성하는 것을 권장
- ForeignKey 인스턴스를 생성하면 인스턴스이름_id로 컬럼이 생성된다.(명시적인 모델관계 파악을 위해)
- on_delete : 외래키가 참조하는 객체가 사라졌을 때, 외래키를 가진 객체를 어떻게 처리할 지를 정의(ex.CASCADE : 부모객체가 삭제됐을 때, 이를 참조하는 객체도 삭제)
$ python manage.py makemigrations
$ python manage.py migrate
- 모델에 대한 수정사항이 발생했기 때문에 migration 과정 진행
admin site 등록
파일 경로 ==> articles/admin.py
[관계 모델 참조]
- Related manager
- Related manager는 N:1 혹은 M:N 관계에서 사용가능한 문맥
- django는 모델 간 N:1 혹은 M:N 관계가 설정되면 역참조할 때에 사용할 수 있는 manager를 생성
[역참조]
- 나를 참조하는 테이블(나를 외래키로 지정한)을 참조하는 것
- 즉, 본인을 외래키로 참조 중인 테이블에 접근하는 것
- N:1 관계에서는 1이 N을 참조하는 상황(외래키를 가지지 않은 Article이 외래키를 가진 Comment를 참조)
article.comment_set.method()
- Article 모델이 Comment모델을 참조(역참조)할 때 사용하는 매니저
- django가 역참조 할 수 있는 comment_set 매니저를 자동 생성해 article.comment_set 형태로 댓글 객체를 참조할 수 있음
- N:1 관계에서 생성되는 Related Manager의 이름은 참조하는 "모델명_set" 이름 규칙으로 만들어짐
- 반면 참조 상황(Comment ==> Article)에서는 실제 ForeignKey클래스로 작성한 인스턴스가 Comment 클래스의 클래스 변수이기 때문에 comment.article 형태로 작성 가능
CREATE
파일 경로 ==> articles/forms.py
- 사용자로부터 댓글 데이터를 입력 받기 위한 CommentForm 작성
- exclude이용하여 article 제외한 나머지를 보여줌
파일 경로 ==> articles/views.py
- 최상단 CommentForm import 할 것
파일 경로 ==> articles/urls.py
- 댓글의 외래 키 데이터에 필요한 정보가 게시글의 pk값이기 때문에 url을 통해 변수를 넘기는 variable routing을 사용
파일 경로 ==> articles/views.py
- save(commit=False)
- 아직 데이터베이스에 저장되지 않은 인스턴스를 반환
- 저장하기 전에 객체에 대한 사용자 지정 처리를 수행할 때 유용하게 사용
파일 경로 ==> articles/detail.html
- line 28 - 32 : commentForm 추가
READ
파일 경로 ==> articles/views.py
파일 경로 ==> articles/detail.html
UPDATE
- 댓글 수정도 게시글 수정과 마찬가지로 구현이 가능하지만 댓글 수정 페이지가 따로 필요하게 됨
- 하지만 일반적으로 댓글 수정은 수정 페이지로 이동 없이 현재 페이지를 유지한 상태로 댓글 작성 Form 부분만 변경되어 수정할 수 있도록 함
- 이처럼 페이지의 일부 내용만 업데이트하는 것은 JS의 영역(현재 진행X)
DELETE
파일 경로 ==> articles/urls.py
파일 경로 ==> articles/views.py
파일 경로 ==> articles/detail.html
1. 댓글 개수 출력하기
1-1. DTL filter - length 사용
{{ comments|length }}
{{ article.comment_set.all|length }}
1-2. Queryset API - count() 사용
{{ comment.count }}
{{ article.comment_set.count }}
파일 경로 ==> articles/detail.html
2. 댓글 없는 경우 대체 컨텐츠
- for empty 문 사용
- line 41-42 추가