mysite/settings.py 파일은 Django 설정을 모듈 변수로 표현한 보통의 python 모듈이다.
기본적으로는 SQLite을 사용하도록 구성되어 있다.
만약 데이터베이스를 처음 경험해보거나, Django에서 데이터베이스를 한번 경험해 보고 싶다면, SQLite가 가장 간단한 방법이다.
SQLite 는 Python에서 기본으로 제공되기 때문에 별도로 설치할 필요가 없다.
하지만 실제 프로젝트를 시작할땐, 나중에 데이터베이스를 교체하느라 골치 아파질일을 피하기 위해서라도 PostgreSQL 같이 좀더 확장성 있는 데이터베이스를 사용하는 것이 좋다.
mysite/settings.py 를 편집할때, 자신의 시간대에 맞춰 TIME_ZONE 값을 설정해야 한다
INSTALLED_APPS
이 설정을 보고싶으면 mysite/settings.py 파일에서 코드를 확인 할 수 있다
이 파일은 현재 장고 인스턴스에서 활성화된 모든 장고 어플리케이션들의 이름이 담겨있다
앱들은 다수의 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용할 수 있도록 패키징하여 배포할 수 있다. 다음의 앱들을 포함하고 있고 기본적으로 제공된다
테이블을 만드는 명령어를 입력 해 준다
$ python manage.py migrate
이 명령어는 적용되지 않은 migrations 들을 적용시키는 역할을 한다.
이 명령어는 데이터베이스에 직접 접근하지 않아도 모델의 반복적인 변경을 가능하게 해준다
모델이란 부가적인 메타데이터를 가진 데이터베이스의 구조를 말한다.
데이터의 필수적인 필드들과 동작들을 포함하고있다
장고는 DRY원칙을 따르며 데이터모델을 한곳에서 정의하고 자동으로 무언갈 유도하는게 목표이다.
우리는 두가지 여론조사 앱을 만들것이다. 질문과 선택 두가지이며,
Question 에는 발행날짜.
Choice 는 선택과 투표집계 라는 두가지 분야를 가질수 있게 만들것 이다.
먼저 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
데이터베이스 의 각 필드는 Field 클래스의 인스턴스로서 표현된다.
CharField는 문자 필드를 표현하고,
DateRimeField는 날짜,시간 필드를 표현한다.
각각 Field 클래스의 생성자에 선택적인 첫번째 위치인수를 전달하여 사람이 읽기좋은 이름을 지정할 수도 있다.
field 클래스 들은 필수 인수들을 가질 수 있다. 이 예제에선, Default로 하여금 votes의 기본값을 0으로 설정했다.
모델에 대한 이 작은 코드가, 장고에서는 상당한 양의 정보를 전달 한다.
하지만 현재프로젝트에 polls 앱이 설치되어 있다는것을 먼저 알려야한다
Django의 앱들은 "꼈다뻇다"를 할 수 있다. 앱을 다수의 프로젝트에서 사용할 수 있으며, 앱을 배포할 수도 있다. Django 사이트에 앱들이 묶여있지 않아도 되기 때문이다
앱을 현재 프로젝트에 포함시키기 위해서 앱의 구성 클래스에 대한 참조를
INSTALL_APPS 설정에 추가해야 한다
추가하는 방법은 'mysite/settings.py' 파일을 편집하여 INSTALLED_APPS 설정에 추가하면 된다
'polls.apps.pollsConfig'가 된다.
apps 하위에 있는 config 모듈의 네이밍(naming)은 앱이름+'Config' 이며, 앱의 제일 앞 글자만 대문자로 작성된다.
만약, 앱 이름을 polls 가 아닌 app_with_underbar 라고 정하면 'AppWithUnderbarConfig'가 된다.
pollsConfig 클래스는 polls/apps.py 파일내에 존재한다.
아래는 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',
]
Diango 는 polls앱에 포함된 것 을 알수 있다
다음 명령을 내리면
$ python manage.py makemigrations polls
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
이렇게 새로운 모델을 만들었다
makemigrations은 당신이 모델을 변경시킨 사실과(이 경우에는 새로운 모델을 만들었습니다)
이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알려주는 명령이다
Migrations 는 장고가 모델에 대한 변경 사항을 저장하는 방법이며, 이는 디스크에 파일이 된다.
장고가 어떻게 사물을 변화시키는지 수동으로 수정하고 싶을 때를 대비해서 사람이 편집할 수 있도록 설계되어 있다
sqlmigrate 명령은 migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여준다
migrate 명령어는 migration 들을 실행 시켜주고, 자동으로 스키마를 관리해준다
migrate 명령어를 입력해보자
$ python manage.py migrate
결과
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
migrate 명령은 아직 적용되지 않은 마이그레이션을 실행하며 이 과정을 통해 모델의 병경사항과 데이터베이스의 스키마 동기화가 이루어진다
마이그레이션 은 강력한 기능이며, 프로젝트 개발때 처럼 데이터베이스나 테이블에 손대지 않고도 모델의 반복적인 변경을 가능하게 해준다
동작 중인 데이터베이스를 자료 손실 없이 업그레이드 하는데 최적화가 되어있다
대화식 Python쉘에서 Django API를 사용해보자. 명령을 입력하면 된다
$ python manage.py shell
명령에 shell 이 들어간 이유는 manage.py 에서 설정된 DJANGO_SETTINGS_MODULE 환경변수 때문이다
이 환경변수는 mysite/settings.py 파일에 대한 임포트 경로를 장고에게 알려주고
장고에서 동작하는 명령을 쉘에서 사용할수 있게 해준다
>>> from polls.models import Choice, Question # Import the model classes we just wrote.
# 아직 질문을 만들지 않았다
>>> Question.objects.all()
<QuerySet []>
# 새 질문을 만들었다
# timezone 명령은 기본설정 파일에서 지원한다
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# 데이터베이스에 저장하자
>>> q.save()
# 이제 id가 생겼다.
>>> q.id
1
# 모델의 필드값을 엑세스 한다.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 속성을 변경 후 데이터베이스에 저장한다.
>>> q.question_text = "What's up?"
>>> q.save()
# objects.all() 이 데이터 베이스에 저장된다.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
polls/models.py 파일의 Question 모델을 수정하여, __str__() 메소드를 Question과 Choice에 추가한다음
커스텀 메소드를 추가한다
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text