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()
함수의 인자들에 대해 살펴봤습니다.
그 뒤를 이어 포스팅하겠습니다.
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 이 적용되는 메세지가 화면에 출력되는 것을 확인할 수 있습니다.
이제, 모델을 정의해 보겠습니다.
모델이란 부가적인 메타데이터를 가진 데이터베이스의 구조(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) 과 같은 모든 일반 데이터베이스의 관계들를 지원합니다.
모델 코드는 Django에게 많은 정보를 줍니다.
위에 적어준 코드로 다음과 같은 일을 할 수 있습니다.
그러나, 가장 먼저 현재 프로젝트에게 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을 모두 수집해 이를 실행합니다.
이 과정을 통해 모델에서의 변경 사항들과 데이터베이스의 스키마의 동기화가 이루어집니다.
모델의 변경을 만드는 세 단계를 짚어보겠습니다.
migration을 만드는 명령과
적용하는 명령이 분리된 것은
버전 관리 시스템에 migration을 commit하고 앱과 함께 출시할 수 있도록 하기 위해서입니다.