본문 바로가기

문돌이 존버/Django 스터디

Mac 버전 장고 데이터베이스 관리 2탄

반응형

오늘은 지난번 데이터베이스 관리 1탄에 이어 2탄에 대한 내용을 다뤄보겠습니다. models.py class Post에 추가로 class Comment 를 설정하려고 합니다. 전체적인 코드는 다음과 같습니다.

from django.db import models

# Create your models here.

class Post(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    create_date = models.DateTimeField(auto_now_add=True) 
    modify_date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title + str(self.create_date)

class Comment(models.Model):
	ost = models.ForeignKey(
        Post,
        on_delete = models.CASCADE,
        null = True
    )
    text = models.CharField(max_length=300)
    create_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True)
    

models.ForeignKey() 설정

다른 모델클래스(테이블)의 객체(row 값)중 하나를 참조하도록 연결하는 것으로 쉽게 말하면 댓글과 해당 게시글을 연결하기 위함입니다.

models.ForeinKey()는 일반적으로 class Comment에 추가합니다. 이유는 Post에 Comment를 연결하려고 하면 한 게시물에 몇 개의 댓글이 달렸는지 일일이 확인하고 새로운 컬럼으로 삽입하기 어렵기 때문입니다. 따라서 반대로 Comment에 Post를 연결하는 방식이 더 효율적입니다. 이렇게 하면 Comment 테이블에 post_id라는 컬럼이 생기는 원리입니다. 

on_delete 설정

CASCADE -> 게시글이 지워지면 해당 댓글도 지운다는 의미 
SET_NULL ->댓글은 지우지 않고 post_id 값을 null 값으로
PROTECT -> 댓글이 하나라도 달려있다면 포스트를 지울 수 없도록 보호

이후 터미널에서 python manage.py makemigrations 를 입력하여 migration 파일을 생성합니다. 실제 데이터베이스에 적용할 준비를 마쳤고 이어서 python manage.py migrate 를 통해 실행시킵니다. 아래처럼 파이썬 환경에 진입한 후 class Post와 class Comment 모두를 import합니다.(import *

python manage.py makemigrations
python manage.py migrate
python manage.py shell
>>> from myapp.models import * 
>>> Post
>>> Comment
>>> Comment.objects.all()
>>> c = Comment.objects.create(text='댓글 부탁드립니다.')
>>> c.text
>>> c.create_date
>>> c.delete()
>>> a = Post.objects.first()
>>> Comment.objects.create(post=a, text='잘 읽었습니다. 감사합니다.')
>>> c = Comment.objects.first()
>>> c.post
>>> c.post == p
>>> Comment.objects.create(post=p, text='아쉽네요 ㅠ')
>>> a.comment_set.all()
>>> p.comment_set.filter(id=2) # id=1, id=3 해보기
>>> p.comment_set.first() # last() 해보기

각 명령에 따른 결과는 직접 해보면서 확인해보시기 바랍니다.^^ 다만, 포스트에 해당하는 댓글을 보기 위해선 comment_set.all() 을 한다는 점은 기억해주세요. 

저희는 on_delete를 CASCADE로 설정했기 때문에 해당 포스트가 지워지면 댓글도 함께 지워저야 합니다. 

>>> p.delete()
>>> p
>>> Post.objects.all()

p.delete() 를 입력하면 아마도 (3, {'myapp.Post' : 1, 'myapp.Comment' : 2}) 라는 출력값이 나올 것입니다. 이는 그대로 해석하면 Post는 1개 지웠고, 거기에 달린 Comment는 2개 지웠다는 의미입니다. 이후 p를 치면 Post가 여전히 나오지만 이는 파이썬 안에 남아있는 객체일뿐, DB에는 지워진 것으로 안심해도 됩니다. 

다음은 관리자 페이지 설정입니다. url을 127.0.0.1:8000/admin 으로 입력하면 관리자 페이지 화면이 나옵니다. 아이디와 비밀번호를 만들기 위해서는 python manage.py createsuperuser 로 진행하면 됩니다. 이후 로그인을 하면 아래와 같은 화면이 나옵니다.

장고의 큰 장점을 활용할 차례입니다. myapp 폴더 안에 있는 admin.py를 클릭하고 다음과 같이 수정해줍니다.

from django.contrib import admin

from .models import Post, Comment
# Register your models here.

admin.site.register([Post, Comment])

관리자 페이지를 새로고침하면 아래와 같이 저희가 추가한 class Post와 Comments를 확인할 수 있습니다. 이곳에서 Post와 Comments 내용을 UI로 자유롭게 수정하거나 추가하는 것이 가능합니다. 

728x90
반응형