프로젝트 내의 Setting.py에서 사용할 데이터베이스를 설정할 수 있다.
# /workspace/MJ/mysite/mysite/settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # 이 부분을 변경
'NAME': BASE_DIR / 'db.sqlite3',
}
}
...
INSTALLED_APPS에 각각의 기능들을 앱으로 만들어 추가할 수 있다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
이 APPS들 중 몇몇은 기본적으로 하나이상의 데이터베이스 테이블을 사용하는데 이 기능을 사용하기 위해 테이블을 아래 명령어를 통해 미리 만들어야 한다.
$ python manage.py migrate
이제 모델을 정의한다. 모델이란 데이터베이스의 레이아웃이라고 보면 된다. 단순한 설문조사 앱을 만드는 것이기 때문에 Qusetion과 Choice 두가지 모델을 생성해본다. Question은 질문(Question)과 발행일 (Publication date), 2개의 필드를 가지게 되며 Choice는 선택지(Choice)와 표(Vote)계산을 위한 두개의 필드를 가지게 되고 두 모델은 연관(Associated)된다.
# /workspace/MJ/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')
# 필드이름 = models.필드의 데이터 형식 지정
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
# 외래키(ForeignKey를 통해 Question의 질문을 받아와 연결시킴)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Django는 앱을 Settings.py에 등록을 해야만 사용 가능하다.
# /workspace/MJ/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',
]
makemigration 명령을 실행한다. 이 명령은 만든 모델들을 Migration이라는 장소의 데이터 베이스내에 저장할 수 있도록 등록해주는 기능이다.
/workspace/Edu_02/mysite > python manage.py makemigrations polls
migrate명령어를 이용해 설정을 완료해준다.
/workspace/Edu_02/mysite > python manage.py migrate
/workspace/Edu_02/mysite > python manage.py shell
Shell 모드 진입 후 아래 명령어로 Choice와 Question을 사용하겠다고 추가해준다.
In[1] : from polls.models import Choice, Question # 추가
In[2] : Question.objects.all() # Question안의 모든 명령어를 호출
Out[2]: <QuerySet []> # 아직 등록한 명령이 없어 빈 리스트를 반환
Shell 모드를 이용해 Question내에 명령어를 만든다.
In [3]: from django.utils import timezone # 사용할 라이브러리 추가
In [4]: q = Question(question_text="What's new?", pub_date=timezone.now
...: ()) # 명령어를 작성한다.
In [5]: q.save() # 만든 명령을 저장한다.
In [6]: q.id
Out[6]: 1 # id의 경우 따로 지정않더라도 장고에서 알아서 부여해준다.
In [7]: q.question_text # 위에서 만든 명령어가 정상작동하는지 확인.
Out[7]: "What's new?"
In [8]: q.pub_date # 마찬가지로 timezone도 정상적으로 들어간 것을 확인.
Out[8]: datetime.datetime(2022, 11, 4, 8, 19, 6, 478161, tzinfo=<UTC>)
작성한 명령어의 내용을 바꿀수도 있다.
In [9] : q.question_text = "What's Up?"
In [10] : q.save()
models.py 안의 def 를 추가하여 다양한 메소드를 추가할 수 있고 커스텀 메소드도 만들어 필요로 하는 다양한 메소드를 넣을 수 있다.
# /workspace/Edu_02/mysite/polls/models.py
import datetime
from django.db import models
from django.utils import timezone
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
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):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self): # 위에서 시도했던 메소드
return self.choice_text
In [1]: from polls.models import Choice,Question
# 다시 접속하 경우 polls 폴더 안의 models.py에서 Choice와 Question을 불러온다.
In [2]: Question.objects.all()
Out[2]: <QuerySet [<Question: What's new?>]>
# 아까는 1이 나왔지만 지금은 정상적으로 질문이 나온다.