이제 게시판과 유저를 연결시켜,
해당 유저가 쓴 게시물인 것을 알 수 있도록 해보겠습니다.
이때 하나의 유저당 몇개의 게시물을 쓸 수 있나요?
제한이 없죠?
이런 경우, user model과 blog model의 관계는 1:n관계인 것을 확인 할 수 있습니다.
이렇게 데이터베이스 간의 연결을 하는 것을 관계형 데이터베이스라고 합니다.
사실 이외에도 1:1, 1:N, N:M 관계가 있지만 우선은 1:N부터 알아보자구요!
1:N관계
우리는 1:N관계를 만들어주기 위해
Blog 모델을 바꿔줄 겁니다:>!
1. 기존의 흔적(?) 지우기
서버를 끄고, db.sqlite3 와
app폴더/migrations 에서 init.py 를 제외한 파일과 폴더를 삭제하세요.
2. Blog Model 수정
2.1) User 모듈 추가
#blog/models.py from django.contrib.auth.models import User
2.2) Blog model에 user 속성을 추가
#blog/models.py user = models.ForeignKey(User,on_delete=models.CASCADE)
ForeignKey 는 1:N 관계를 설정해주는 Field입니다.
1:N 중에서 N인 쪽에서 관계를 선언해주며, 두 개의 인자를 필요로 합니다.
하나는 대상이 되는 클래스(연결대상 모델), 다른 하나는 삭제 시 이슈에 대한 설정입니다.
* on_delete
1인 쪽의 데이터가 삭제 되었을 시,
N인 쪽의 데이터를 어떻게 처리할 지에 대한 설정입니다.
- CASCADE : 이와 연결되어 있는 모든 N 쪽 데이터를 삭제합니다.
- PROTECT : 1인 쪽의 데이터가 삭제가 되지 않도록 보호해줍니다.
- SET_NULL : null 로 값을 대체하게 되어 필드에 null=True 옵션이 있어야만 가능합니다.
- SET_DEFAULT : default 로 값을 대체하게 되어 필드에 default=True 옵션이 있어야만 가능합니다.
- SET : 대체할 값이나 함수를 지정합니다.
- DO_NOTHING : 아무 것도 하지 않지만 db 에서 오류가 발생할 수 있습니다.
* 서로의 모델에 접근하는 방법
# N -> 1 blog.user # 1 -> N user.blog_set
N의 입장에서는 관계되어 있는 모델은 하나이므로 바로 접근이 가능하지만,
1의 입장에서는 관계되어 있는 객체가 많기 때문에 set 을 통해서 접근할 수 있습니다.
2.3) 다시 migrate
#터미널 python manage.py makemigrations python manage.py migrate
3. blog/views.py
def create(request): if request.method == "GET": return render(request,'new.html') elif request.method == "POST": post = Blog() post.user = request.user post.title = request.POST["title"] post.content = request.POST["content"] post.save() return redirect('/')
4. 글쓴이 혹은 admin만 수정/삭제 가능하도록 하기
<!-- blog/templates/detail.html --> <!-- blog 게시물의 글쓴이와 로그인한 유저가 같거나 admin만 보이는 화면 --> {%if request.user == blog.user or request.user.is_staff %} <a href="">수정</a> <a href="">삭제</a> {%endif%}
'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글
Pagination (0) | 2020.07.23 |
---|---|
로그인, 회원가입 3 -User Model 확장 / OneToOneField 사용 (0) | 2020.07.21 |
Django 회원가입, 로그인 (1) | 2020.07.20 |
Django 구동원리 : MTV (0) | 2020.07.19 |
Django project 4 - url 관리 (0) | 2020.07.16 |
댓글