DB (N:1 / Comment - Article)

윤동훈·2023년 4월 12일
0

Foreign Key

  • 외래 키(외부 키)
  • 관계형 DB에서 다른 테이블의 행을 식별할 수 있는 키
  • 참조되는 테이블의 기본 키를 가리킴(외래키의 값이 반드시 부모 테이블의 기본 키일 필요는 없지만 유일한 값이어야 함 - 참조 무결성)
    • 참조무결성? DB 관계모델에서 관련된 2개의 테이블 간의 일관성을 말함
    • 외래키가 선언된 테이블의 외래키 속성의 값은 그 테이블의 부모가 되는 테이블의 기본 키 값으로 존재해야 함
  • 참조하는 테이블의 행 1개의 값은, 참조되는 측 테이블의 행 값에 대응됨
    • 이 때문에 참조하는 테이블의 행에는, 참조되는 테이블에 나타나지 않는 값을 포함할 수 없음
  • 참조하는 테이블 행 여러 개가 참조되는 테이블의 동일한 행을 참조할 수 있음

N:1 (Comment(N) : Article(1))

  • Comment 모델과 Article 모델 간 관계 설정
  • n개 이상의 댓글은 1개의 게시글에 작성될 수 있음

월요일 교재 22p 사진 삽입

  • Django Relationship fields
  1. OneToOneField() : A one to one relationship
  2. ForeignKey() : A many to one relationship
  • N:1을 담당하는 django의 모델 피드 클래스
  • 외래키 속성을 담당
  • 2개의 필수 위치 인자 필요
    • 참조하는 model class
    • on delete 옵션
  1. ManyToManyField() : A many to many relationship

Comment 모델 정의

파일 경로 ==> 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 형태로 작성 가능

Comment CRUD

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

  • line 28 - 34 추가

UPDATE

  • 댓글 수정도 게시글 수정과 마찬가지로 구현이 가능하지만 댓글 수정 페이지가 따로 필요하게 됨
  • 하지만 일반적으로 댓글 수정은 수정 페이지로 이동 없이 현재 페이지를 유지한 상태로 댓글 작성 Form 부분만 변경되어 수정할 수 있도록 함
  • 이처럼 페이지의 일부 내용만 업데이트하는 것은 JS의 영역(현재 진행X)

DELETE

파일 경로 ==> articles/urls.py

파일 경로 ==> articles/views.py

  • 최상단 Comment import

파일 경로 ==> articles/detail.html

  • line 33 - 35 추가

Comment 추가사항

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

  • line 29 - 31 추가

2. 댓글 없는 경우 대체 컨텐츠

  • for empty 문 사용
  • line 41-42 추가

0개의 댓글