6 분 소요

제 4강: 모델 만들기

4.1. 모델 개념 복습

모델은 MVC 디자인 패턴중 M을 의미한다. 이는 애플리케이션의 정보, 데이터를 나타내는것으로 데이타베이스, 변수와 같은 정보와 이를 가공하는 컴포넌트를 의미한다.

DB에서는 저장할 데이터의 중요한 필드와 데이터 형식을 가진다.

4.2. 투표앱을 위한 모델 설계

투표앱을 만들기위해 Question과 Choice모델을 만들도록한다. 모델의 구조는 다음과 같다.

Question    
기능 필드명 형식
질문 question_text char[200]
공개날짜 pub_date DateTimeField
Choice    
기능 필드명 형식
Question Question 1:N 외래키(ON DELETE CASCADE)
선택지 question_text char[200]
투표 votes IntegerField(기본값0)

이러한 모델은 파이썬 클래스로 작성된다.


#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)

각 모델은 django.db.models.Model을 상속받는 모델이다. 이는 클래스 변수를 포함하고 각 클래스 변수는 모델의 데이터가 저장될 DB의 필드와 같은 역할을 한다. DB의 필드는 모델 클래스 내부에 정의 되는 Field클래스의 오브젝트와 같다. 따라서 파이썬 상에서 시용되는 이름이 데이터베이스의 칼럼명으로 사용되는것이다.

수행된 작업은 다음과 같다

  • 이 앱의 데이터베이스 스키마 생성 (CREATE TABLE statements).
  • Question과 Choice 오브젝트에 엑세스 할 수 있는 Python database-access API 생성.

4.3. 모델 활성화

앱의 모델을 사용하기위해 프로젝트의 settings.py에 모델을 추가한다. 이후 터미널에서 makemigrations polls를 실행하면 Migrations for ‘polls’ 이 실행된다. 이는 변경 사항에 대한 마이그레이션 파일 생성을 적용한다.

이후 만들어진 /migrations/0001_initial.py를 실제 어떻게 수행할지 sqlmigrate polls 0001 로 조회 가능하다.

python manage.py check를 사용해 마이그레이션과 DB변경 전 문제를 체크 가능하다.

최종적으로 python manage.py migrate를 사용해 마이그레이션을 수행한다.

settings.py


INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    ...
]

terminal

PS C:\...\learnDjango\mysite> python manage.py makemigrations polls
Migrations for 'polls':
  polls\migrations\0001_initial.py
    - Create model Question
    - Create model Choice
  

PS C:\...\learnDjango\mysite> python manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" bigint NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;


PS C:\...\learnDjango\mysite> python manage.py check
System check identified no issues (0 silenced).


PS C:\...\learnDjango\mysite> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK

태그:

카테고리:

업데이트:

댓글남기기