본문 바로가기
개발/Django_python 웹 프레임워크

로그인, 회원가입 2 -Blog Model - User Model 연동, 1:N

by 자유로운 코끼리 2020. 7. 20.
728x90

이제 게시판과 유저를 연결시켜,

해당 유저가 쓴 게시물인 것을 알 수 있도록 해보겠습니다.

 

이때 하나의 유저당 몇개의 게시물을 쓸 수 있나요?

제한이 없죠?

이런 경우, 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%}

댓글