
mysite/settings.py : Django 설정을 모듈 변수로 표현한 보통의 Python 모듈
INSTALLED_APPS : 현재 설치되어 있는 앱
기본 앱
python manage.py migrate
기본 어플리케이션들 중 몇몇은 최소한 하나 이상의 데이터베이스 테이블을 사용하는데, 그러기 위해서는 데이터베이스에서 테이블을 미리 만들 필요가 있다.
설문 조사이기 때문에 질문지와 선택 이 두가지 모델이 필요하다.
Question 에는 질문과 발행일을 위한 두 개의 필드를 가집니다. Choice 는 선택 텍스트와 투표 집계를 위한 두 개의 필드를 가집니다. 각각의 Choice모델은 Question과 연관됩니다.
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)
Question에는 질문 내용과 생성날짜가 있고, 질문의 데이터형은 문자이고 최대 200자이다. 발행일에 대해서는 시간 타입을 가지고 있다.
Choice에는 선택지에 해당하는 질문과 투표수가 있다. 선택지에 대한 Question 데이터 타입ㄴ은 ForeignKey(외래 키)이다. 외래 키가 Question을 참조하겠다고 의미, CASCADE : Question이 삭제되면 얘도 삭제되겠다를 의미.
setting.py안에 INSTALLED_APPS에
"polls.apps.PollsConfig"를 추가해주면 된다.
poll파일 안에 app 파일 안에 PollsConfig를 등록한다고 의미
python manage.py makemigrations polls
-> 모델을 변경시킨 사실과 변경사항을 migration으로 저장
python manage.py migrate
-> migrate 를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성
python manage.py shell
-> 파이썬 쉘 실행
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet []> # 아직 질문 생성 안해서
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) # 질문과 질문 생성 날짜 생성
>>> q.save() # 저장
>>> q.id # 질문에 id 값이 생긴다
1
# 아래와 같이 정보를 불러올 수 있다
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
>>> q.question_text = "What's up?" # 질문 바꾼 후
>>> q.save() # 저장
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
models.py에 str 메소드 추가
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
이후 다시 shell 실행
>>> from polls.models import Choice, Question
>>> Question.objects.all() # __str__() 메서드 되는지 확인
<QuerySet [<Question: What's up?>]>
# db API 확인하는 여러 방법
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith="What")
<QuerySet [<Question: What's up?>]>
#pub_date로 질문 확인
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# 존재하지 않는 질문을 확인할 때 오류
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
# primary-key 사용하여 질문 확인하기
>>> Question.objects.get(pk=1)
<Question: What's up?>
# was_published_recently() 되는지 확인
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# 선택지 객체 생성
>>> q = Question.objects.get(pk=1)
# 선택지 확인 : 비어있는게 정상
>>> q.choice_set.all()
<QuerySet []>
# 선택지 만들기
>>> q.choice_set.create(choice_text="Not much", votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text="The sky", votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)
# 객체의 질문 확인하기
>>> c.question
<Question: What's up?>
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# delete() 메서드로 질문 삭제
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
>>> c.delete()
python manage.py createsuperuser
이후 개발서버 시작
개발서버에서 'http://127.0.0.1:8000/admin/'으로 이동하면 관리자 사이트로 들어갈 수 있다
관리자 사이트에서 poll app 변경하도록 하기 : polls/admin.py 파일 수정
from django.contrib import admin
from .models import Question
admin.site.register(Question)
이후 자유롭게 질문 생성/삭제가 가능하다
장고에서 상당히 편리한 기능