728x90
앞에서는 Comment(N)와 Article(1) 모델 간 관계를 설정하였다. 이번엔 Article(N)과 User(1) 간 관계를 알아보자
"0개 이상의 게시글은 1개의 회원에 의해 작성될 수 있음"
목차
- Referencing the User model
- CREATE
- Delete
- Update
- Read
1. Referencing the User model
Django에서 User 모델을 참조하는 방법
- settings.AUTH_USER_MODEL
- 반환 값 : 'accounts.User' (문자열)
- User 모델에 대한 외래 키 또는 M:N 관계를 정의할 때 사용
- models.py의 모델 필드에서 User 모델을 참조할 때 사용
- get_user_model()
- 반환 값 : User Object (객체)
- 현재 활성화(active) 된 User 모델을 반환
- 커스터마이징한 User 모델이 있을 경우는 Custom User 모델, 그렇지 않으면 User를 반환
- models.py가 아닌 다른 모든 곳에서 유저 모델을 참조할 때 사용
모델 관계 설정
- Article 모델에 User 모델을 참조하는 외래 키 작성
※ Migration 진행
- 기존에 존재하던 테이블에 새로운 칼럼이 추가되어야 하는 상황
- 따라서, migrations 파일이 곧바로 만들어지는 것이 아닌 일련의 과정 필요
python manage.py makemigrations
- 첫 번째 화면
- 기본적으로 모든 컬럼은 NOT NULL 제약조건이 있기 때문에 데이터가 없이는 새로 추가되는 외래 키 필드 user_id가 생성되지 않음
- 그래서 기본값을 어떻게 작성할 것인지 선택해야 함
- 1을 입력하고 Enter 진행 (다음 화면에서 직접 기본 값 입력)
- 두 번째 화면
- article의 user_id에 어떤 데이터를 넣을 것인지 직접 입력해야 함
- 마찬가지고 1 입력하고 Enter 진행
- 그러면 기존 작성된 게시글이 존재한다면 모두 1번 회원이 작성한 것으로 처리
- migrations 파일 생성 후 migrate 진행
- article 테이블 스키마 변경 및 확인
Django에서 User 모델을 참조하는 방법 정리
- models.py에서는 settings.AUTH_USER_MODEL
- 다른 모든 곳에서는 get_user_model()
2. CREATE
- 인증된 회원의 게시글 작성 구현하기
- 작성하기 전 로그인을 먼저 진행한 상태로 진행
ArticleForm
- ArticleForm 출력을 확인해보면 create 템플릿에서 불필요한 필드(user)가 출력됨
- 이전에 CommentForm에서 외래 키 필드 article이 출력되는 상황과 동일한 상황
- user 필드에 작성해야 하는 user 객체는 view 함수의 request 객체를 활용해야 함
- 따라서 아래와 같이 수정
외래 키 데이터 누락
- 게시글 작성 시 NOT NULL constraint failed: articles_article.user_id 에러 발생
- "NOT NULL 제약 조건이 실패했다. articles_article 테이블의 user_id 컬럼에서"
- 게시글 작성 시 외래 키에 저장되어야 할 작성자 정보가 누락되었기 때문
- 게시글 작성 시 작성자 정보가 함께 저장될 수 있도록 save의 commit 옵션을 활용
3. DELETE
게시글 삭제 시 작성자 확인
- 이제 게시글에는 작성자 정보가 함께 들어있기 때문에 현재 삭제를 요청하려는 사람과 게시글을 작성한 사람을 비교하여 본인의 게시글만 삭제할 수 있도록 함
4. UPDATE
게시글 수정 시 작성자 확인
- 수정도 마찬가지로 수정을 요청하려는 사람과 게시글을 작성한 사람을 비교하여 본인의 게시글만 수정할 수 있도록 함
- 추가로 해당 게시글의 작성자가 아니라면, 수정/삭제 버튼을 출력하지 않도록 하기
5. READ
게시글 작성자 출력
- index 템플릿과 detail 템플릿에서 각 게시글의 작성자 출력
728x90
'Back-end > Django' 카테고리의 다른 글
[DB with Django] M:N relationship (0) | 2022.10.13 |
---|---|
[DB with Django] N:1 (Comment - User) (0) | 2022.10.12 |
[DB with Django] N:1 (Comment-Article) (0) | 2022.10.12 |
[Django] Limiting access to logged-in users (0) | 2022.10.05 |
[Django] Authentication with User (0) | 2022.09.19 |