Django - 2. Tutorial 따라하기 2에서

설문조사 앱을 만들기 위해
$ python manage.py startapp polls으로
polls라는 directory를 생성했습니다.

그리고 view를 만들기 위해
polls/views.py파일에 코드를 작성해주었습니다.

그리고 view를 호출하기 위해 polls/urls.py라는 URLconf를 생성했습니다.

그리고 root URLconf에서 polls.urls 모듈을 바라보게 설정하기 위해 include()함수를 이용했습니다.

마지막으로 path()함수의 인자들에 대해 살펴봤습니다.

그 뒤를 이어 포스팅하겠습니다.


1. Database setup

mysite/settings.py 파일은 Django 설정을 모듈 변수로 표현한 Python 모듈입니다.

이 파일의 DATABASE 부분을 살펴보겠습니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

기본적으로는 SQLite을 사용하도록 구성되어 있습니다.

그리고 INSTALLED_APPS 부분을 살펴보겠습니다.

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

Django 인스턴스에서 활성화된 모든 Django 어플리케이션들의 이름이 담겨 있습니다. 앱들은 다수의 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용될 수 있도록 패키징하여 배포할 수 있습니다.

이 어플리케이션들은 기본으로 제공됩니다.

이러한 기본 어플리케이션들 중 몇몇은 최소한 하나 이상의 데이터베이스 테이블을 사용하는데, 그러기 위해서는 데이터베이스에서 테이블을 미리 만들 필요가 있습니다. 이를 위해, 다음의 명령을 실행하겠습니다.

$ python manage.py migrate

migrate 명령은 INSTALLED_APPS 의 설정을 탐색하여, mysite/mysite/settings.py 의 데이터베이스 설정과 데이터베이스 migrations에 따라, 필요한 데이터베이스 테이블을 생성합니다.

이 명령을 수행하면 각 migration 이 적용되는 메세지가 화면에 출력되는 것을 확인할 수 있습니다.

2. Creating Models

이제, 모델을 정의해 보겠습니다.
모델이란 부가적인 메타데이터를 가진 데이터베이스의 구조(layout)를 말합니다.

단순한 설문조사(poll) 앱을 위해
Question 과 Choice 라는 두개의 모델을 만들어 보겠습니다.

Question 은
질문(question) 과 발행일(publication date) 을 위한 두개의 필드를 가집니다.

Choice 는 선택지(choice) 와 표(vote) 계산을 위한 두개의 필드를 가집니다.

각 Choice 모델은 Question 모델과 연관(associated) 됩니다.

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 이라는 클래스의 서브클래스로 표현됩니다.

각 모델은 몇개의 클래스 변수를 가지고 있으며, 각각의 클래스 변수들은 모델의 데이터베이스 필드를 나타냅니다.

데이터베이스의 각 필드는 Field 클래스의 인스턴스로서 표현됩니다.

CharField 는 문자(character) 필드를 표현하고, DateTimeField 는 날짜와 시간(datetime) 필드를 표현합니다.

이것은 각 필드가 어떤 자료형을 가질 수 있는지를 Django 에게 말해줍니다.

각각의 Field 인스턴스의 이름(question_text 또는 pub_date)은 기계가 읽기 좋은 형식(machine-friendly format)의 데이터베이스 필드 이름입니다.

몇몇 Field 클래스들은 필수 인수가 필요합니다. 예를 들어, CharField 의 경우 max_length 를 입력해 주어야 합니다.

또한 Field 는 다양한 선택적 인수들을 가질 수 있습니다. 이 예제에서는, default 로 하여금 votes 의 기본값을 0 으로 설정하였습니다.

마지막으로, ForeignKey 를 사용한 관계설정에 대해 설명하겠습니다. 이 예제에서는 각각의 Choice 가 하나의 Question 에 관계된다는 것을 Django 에게 알려줍니다. Django 는 다-대-일(many-to-one), 다-대-다(many-to-many), 일-대-일(one-to-one) 과 같은 모든 일반 데이터베이스의 관계들를 지원합니다.

3. Activating Models

모델 코드는 Django에게 많은 정보를 줍니다.

위에 적어준 코드로 다음과 같은 일을 할 수 있습니다.

  1. 이 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE 문)
  2. Question과 Choice 객체에 접근하기 위한 Python 데이터베이스 접근 API를 생성

그러나, 가장 먼저 현재 프로젝트에게 polls 앱이 설치되어 있다는 것을 알려야 합니다.

앱을 현재의 프로젝트에 포함시키기 위해서는, 앱의 구성 클래스에 대한 참조를 INSTALLED_APPS 설정에 추가해야 합니다. PollsConfig 클래스는 polls/apps.py 파일 내에 존재합니다. 따라서, 점으로 구분된 경로는 'polls.apps.PollsConfig'가 됩니다. 이 점으로 구분된 경로를, mysite/mysite/settings.py 파일을 편집하여 INSTALLED_APPS 설정에 추가하면 됩니다.

#mysite/mysite/settings.py

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

이제, Django는 polls 앱이 포함된 것을 알게 되었습니다. 다음 명령을 내려보겠습니다.
$ python manage.py makemigrations polls
그러면, 다음과 같은 화면이 나옵니다.

Migrations for 'polls':
  polls/migrations/0001_initial.py:
    - Create model Choice
    - Create model Question

makemigrations 을 실행시킴으로서, 모델을 변경시킨 사실과(이 경우에는 새로운 모델을 만들었습니다.) 이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알려줍니다.

migration은 Django가 모델의 변경사항을 저장하는 방법으로써, 디스크상의 파일로 존재합니다.

migrate 명령어는 migration들을 실행시켜주고, 자동으로 데이터베이스 스키마를 관리해줍니다.

이 명령을 알아보기 전에 migration이 내부적으로 어떤 SQL 문장을 실행하는지 살펴보겠습니다. sqlmigrate 명령은 migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여줍니다.
$ python manage.py sqlmigrate polls 0001

이제, migrate 를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성해 보겠습니다.
$ python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK

migrate 명령은 아직 적용되지 않은 migration을 모두 수집해 이를 실행합니다.

이 과정을 통해 모델에서의 변경 사항들과 데이터베이스의 스키마의 동기화가 이루어집니다.


모델의 변경을 만드는 세 단계를 짚어보겠습니다.

  1. (models.py 에서) 모델을 변경합니다.
  2. python manage.py makemigrations을 통해 이 변경사항에 대한 migration을 만듭니다.
  3. python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용합니다.

migration을 만드는 명령과
적용하는 명령이 분리된 것은
버전 관리 시스템에 migration을 commit하고 앱과 함께 출시할 수 있도록 하기 위해서입니다.