● 작성자 추가
Blog project의 다대일 관계 이해
먼저 다대일 관계는 여러 개의 모델이 하나의 모델에 연결되는 관계를 말한다. 예시를 들면 다음과 같다.
Post를 기준으로 하나의 Post는 하나의 User, 하나의 Category와 관계를 가진다. 이것이 다대일 관계이다.
author 필드에는 어떤 내용이 필요한가?
Post 작성시 사용자명을 문자열로 저장하는 내용이 필요할 것이고, 사용자 명을 바꾸거나 삭제되었을시 이를 반영하는 내용도 필요할 것이다. 또한 작성자 하나가 여러 Post를 연결하는 경우 다대일 관계에서는 ForeignKey를 활용해야 할 것이다.
ForeignKey로 author 필드 구현
models.py에 author 필드 추가 후 migration
Django에서 제공하는 User를 사용하기 위해 from django.contrib.auth.models import User를 입력한다. Post 작성자가 DB에서 삭제 되었을 시 포스트도 같이 삭제하기 위한 on_delete=models.CASCAD 와 포스트 목록에서 작성자 정보까지 나타나도록 __str__() 함수도 수정한다.
migration 하려 했더니 author 필드에는 null이 올 수 없다면서 오류를 출력한다. default를 제공하거나 나가든지 아니면 models.py에 default 값을 선언하라 는 친절한 해결책을 제시해준다. 그것도 모자라 1, 2를 입력하여 손쉽게 해결 할 수 있도록 해준다. 일단 1번 해결책으로 문제를 해결한다.
1번을 입력하니 default 값을 입력하라는데 pk=1인 User를 author로 지정하도록 1을 입력하고 migration 한다.
pk 값이 1을 가진 User인 jus가 Author로 설정 되어있다.
다른 사용자가 게시물을 작성할 때 테스트하기
테스트를 위한 User를 새로 추가한다. 하고 Post를 작성해 본다.
작성자 정보가 삭제될 때 포스트까지 삭제되는지 확인
정상적으로 다른 User의 Post가 등록되었으니 이제는 on_delete=models.CASCADE 가 제대로 작동하는지 확인해 본다.
귀신같이 Post가 삭제 되었음을 볼 수 있다.
연결된 사용자가 삭제되면 빈 칸으로 두기
on_delete=models.SET_NULL 사용하기
이전의 on_delete=models.CASCADE 는 author 삭제시 post도 같이 삭제 되었지만 이번의 on_delete=models.SET_NULL은 author가 삭제 되더라도 post는 그대로 남고 작성자명을 빈칸으로 남기게 된다.
User 옆에 null=True 를 입력함으로써 해당 DB의 필드 값에 null을 넣을 수 있게 된다.
Post 작성자가 삭제 되었을 때 테스트
새로운 User를 생성 후 Post를 작성하고 그 User를 삭제 했을 시 작성자가 none 으로 표시 되는지 확인 해 본다.
성공적으로 None 이 뜬다.
포스트 목록 페이지와 포스트 상세 페이지에 author 반영하기
포스트 목록 페이지에 작성자 추가
TDD에 따라 템플릿 파일부터 손 보기 전에 테스트 코드부터 작성한다. User.objects.create_user로 사용자들을 생성하고 def test_post_list(self): 함수의 # 3.1 부분에서 author=self.user_사용자명 인자를 추가한다. 맨 아래 부분에는 메인영역에 제대로 나오는지 확인하기 위한 코드를 추가한다 이때 작성자명이 대문자로 보이도록 .upper()를 붙여준다.
이전에 실수로 누락한 작성자명을 나타내도록 하는 코드를 입력하도록 한다.
정상적으로 대문자로 출력됨을 볼 수 있다.
포스트 상세 페이지에 작성자 추가
마찬가지로 post_detail.html 파일을 손보기에 앞서서 테스트 코드부터 짜보도록 한다. 마찬가지로 Post 모델에 작성자명 레코드를 생성하고 마지막 줄에 post_001 의 title, contant, author가 post_area에 text 형식으로 존재하는지 확인하는 테스트 코드를 작성한다.
post_detail.html 도 수정해준다.
'Backend > Django + Bootstrap 개발 일지' 카테고리의 다른 글
18. 다대일 관계 구현 (카테고리 기능 2) (0) | 2022.08.07 |
---|---|
17. 다대일 관계 구현 (카테고리 기능) (0) | 2022.08.05 |
15. 템플릿 모듈화 (0) | 2022.07.27 |
14. 테스트 주도 개발 적용 (0) | 2022.07.25 |
13. 테스트 주도 개발(TDD)을 이용한 블로그 기능 구현 목차 개요 (0) | 2022.07.23 |