본문 바로가기
Django/튜토리얼

Django/장고] 파이썬으로 웹페이지 만들기 튜토리얼 - 3부

by 붕어사랑 티스토리 2021. 5. 22.
반응형

1. 모델 작성하기

2부에서 MTV에서 View를 작성해 보았습니다. 이번에는 데이터베이스인 Model을 작성해 보겠습니다.

 

 

튜토리얼에서 투표 어플리케이션을 만든다고 하였습니다.

투표를 하기위해서는 질문과 선택에 관한 데이터베이스가 있어야겠죠? 아래와 같이 코드를 작성해줍시다.

polls/models.py

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Question이라는 모델이 생성되었고 이 모델안에 질문내용과 발행날짜가 들어갑니다.

Choice라는 모델이 생성되었고 선택한 질문내용과 선택내용, 투표번호가 있네요.

 

아래코드에서 Question과 Choice는 외래키로 연결되었으며 Question이 지워질시 cascade하게 Choice도 지워지도록 설정합니다.

(외래키가 무엇인지 모르시는 분들은 간단히 이해하자면 Choice라는 모델은 Question에 종속되어있다고 이해하시면 됩니다. 일단 넘어가고 나중에 데이터베이스 키의 개념을 구글링으로 공부하는걸 추천드립니다.)

question = models.ForeignKey(Question, on_delete=models.CASCADE)

여기서 CharField는 문자열로 이루어진 데이터필드를 의미하며 max_length로 글자수 제한을 할 수 있습니다.

IntegerField는 정수형 데이터필드이며 default값을 설정해 줄 수 있습니다.

 

 

 

2. 모델 활성화

앞선 튜토리얼에서 프로젝트에 application을 연결해주는건 url을 연결해주는것과 같다! 라고 배웠습니다.

사실 여기서 한가지 더 해주어야 할 것이 있습니다. 바로 application의 모델도 프로젝트 모델 스키마에 연결해주어야 하는 것이지요.

 

(스키마가 뭔지 모르시는 분들은 데이터베이스 설계해놓은 하나의 형태라고 생각하시면 되겠습니다.)

 

 

mysite/settings.py 에 들어가보시면 아래와 같이 INSTALLED_APPS 라는 리스트가 있습니다.

 

 

아래사항 참고해주세요

(1부에서 커맨드에따라 setting.py의 위치가 다르네요. mysite/settings.py가 안보이시는 분들은 새로 만드시는게 아니라 confing/settings.py를 보시면 됩니다. 댓글로 문제 제보해주신분들 감사합니다)

 

 

 

 

 

 

mysite/settings.py

application의 모델을 활성화 하려면 여기다가 우리의 투표 application을 등록해주어야 합니다.

 

먼저 application의 이름을 알아야 합니다. application의 이름은 polls/apps.py에서 확인 하실 수 있어요.

 

polls/apps.py

저기 name이라 적혀있는데 사실 app등록에서는 클래스이름인 PollsConfig가 쓰입니다.

 

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

위와같이 앱을 등록해줍시다!

 

반응형

 

다음으로 Migration을 해주어야 합니다. Migration이란 아까 말씀드린것 처럼 기존에 있던 프로젝트의 데이터베이스 모델에 application의 데이터베이스 모델을 이식시키는 과정을 얘기합니다.

 

프로젝트 폴더에서 아래와 같은 커맨드를 입력해주세요.

 

python manage.py makemigrations polls

Migration에 성공하면 아래와 같은 로그가 생성됩니다.

폴더구조를 확인해보니 polls 폴더 밑에 migrations 라는 폴더가 생기고 0001_initial.py 라는 파일이 생성됐네요.

0001_initial.py를 확인해보면 아래와 같은 코드가 생성되었습니다.

조금더 설명드리자면 makemigrations 커맨드는 application에서 model의 수정사항을 기록합니다. 아직 프로젝트에 여러분의 application이 migration 되지 않았습니다!!

 

 

 

하기 커맨드를 입력해야 polls의 모델 정보가 migrate 됩니다.

python manage.py migrate

 

이 화면을 보셨다면 성공입니다!

이제 여러분은 application을 만들고 프로젝트에 앱포팅, 데이터베이스까지 연결시켰습니다.

 

 

2부에서 했던 얘기

 

프로젝트에 application을 연결하는것은 url을 연결해주는것이다!

 

이 얘기에 조금더 추가해주겠습니다.

 

 

프로젝트에 application을 연결하는것은 url도 연결하고 model도 migration 해주어야 한다!

 

 

 

3. makemigrations와 migrate의 차이?

자 여기서 궁금한점이 하나 생길 것 입니다.

 

makemigrations과 migrate의 차이는 무엇인가요?

 

makemigrations는 여러분의 application의 model의 model에 대한 변화를 기록합니다.

migrate는 makemigrations의 변화 기록을 참고하여 실제로 프로젝트 모델 스키마에 application의 모델 변화사항을 반영해주는 커맨드이고요.

 

 

makemigrtions를 치면 0001_initial.py가 나옵니다. 실제 데이터베이스의 migration은 sql 언어로 진행되는데, Django에서는 0001_initial.py에서 사람이 읽기 편하게 파이썬 언어로 나타내주고이를 바탕으로 sql언어로 변환하여 migration을 진행합니다.

 

이후 모델링을 수정하고 다시 makemigrations를 해보면 0002 이렇게 쌓여갑니다.

 

실제로 이행되는 sql문을 보고싶다면 아래와 같은 커맨드를 입력해보세요.

 

python manage.py sqlmigrate polls 변경기록번호

 

 

지금 예시에서는 아래와같이 치면 되겠네요.

python manage.py sqlmigrate polls 0001

그럼 0001에 해당하는 sql문이 나옵니다.

 

 

반응형

댓글