데이터저장에는 데이터베이스가 필요함 종류는 오라클 등등 다양하지만 경량 db인 sqlite 사용할거다. 장고에 기본 탑재가 되어 있다.
장고는 디비종류 상관없이 작업을 할 수 있게 도와준다. 즉 다른 db 를 사용하고자 한다면 그거에 맞게 바꿔서 사용하면 된다.
우리가 쓰는 데이터베이스 이름 확인해보자. sqlite 라며?
오 과연 databases 내 확인해보니까 sqlite3 이라 쓰여 있다.
기능들의 모임을 앱이라 부른다.
오 다양한 앱들이 있구 이러한 각각의 앱들이 이러한 이러한 이러한 기능을 제공하고 잇는구나.
installed apps 에 저렇게 적어놓으면 장고에게 나 이러이러한 앱들 쓸거야 알려주는 것이다.
이미 장고에 탑재된 기본적인 앱들이 있고 세션에서 어스랑 뭐는 장고를 가지고 개발하는 입장에서 사용하지 않으므로 주석처리를 했던 것을 기억하고잇다. 자 일단 저 인스톨드 앱스에 우리가 만든 앱을 넣어줄 예정이라는 거지.
데이터베이스 테이블을 생성하기 위해서 다음 코드를 친다
py manage.py migrate
question 과 choice 에 대한 데이터베이스 모델을 만들도록 하자.
polls/models.py
작성해놓고 설명을 보자.
데이터 베이스 모델은 Question 과 Choice 이렇게 둘 있다.
Question 안에는 질문 내용 텍스트와 생성 날짜가 있고 Choice 안에는 선택지에 해당하는 질문, 초이스텍스트, 투표수가 있다. 질문의 데이터형은 문자 최대길이 이백자, 발행일에 대해서는 시간 타입 (DateTimeField) 을 가지고 있다.
초이스에도 보이듯 문자, 숫자 타입 (CharField, IntegerField) 을 가지고 있다.
이 Choice 선택지 내 Question 에 대한 데이터타입 은 foreignkey
라고 해서 외래키다 라고 명시되어 있다.
이 말인 즉슨,
현재 위에 있는 Question 이라는 데이터 모델을 참조하겠다며 위에 생성된 Question을 가리키고 있다.
그리고 CASCADE는 만일 위의 Question 이 삭제가 되면 Class Choice 내의 Question도 삭제가 되겠다 라고 명시해준 의미 이다.
이제 데이터모델이 생성이 되었고
foreignkey 다시 풀어보면,
둘 테이블 에서 Choice라는 테이블의 Question은 위의 Question 테이블을 참조
하고 있기 때문에, 하나의 Question에 여러 개의 Choice를 갖는 구조이기 때문에 1대 다 라고 보면 되겠다.
다음 이제 모델을 만들었으니 이제 이 모델을 활성화 해보자.
장고의 철학은 앱별로 기능이 나뉘어져 있는데 앱을 등록 하느냐 마느냐에 따라서 사용하겠다 아니겠다 명시를 해줄 수가 있다. (안쓰겠다면 주석처리 ##)
설문조사 앱을 등록하기 위해서 INSTALLED_APPS 에 등록을 해보자.
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',
]
'polls.apps.PollsConfig',
이걸 추가하면 뭐 앱을 등록하겠다 그건거 같은데 저게 뭔 뜻임? 어디서 온거야? 라고 물어볼 수 있다.
그럼 polls내 apps.py 가보면 알수 있다.
pollsconfig 파일을 등록을 하겠다 이거다.
그리고 다음으로
py manage.py makemigrations polls 수행한다.
지금 모델을 작성했는데 마이그레이션이라는 장소에다가 이 모델들을 데이터베이스 내에 테이블을 생성할 수 있도록 설계도를 만드는 작업을 하는 것이다. (이해가 잘.. )
콘솔창을 보면 polls migrations 0001_initial.py 마이그레이션 차선의 내의? 파일이 생성된 것을 볼 수 있다.
0001_initial.py 을 열어서 보게 되면 데이터베이스 테이블을 생성하기 위한 설계도가 만들어져 있는 것을 확인할 수 가 있다.
py manage.py migrate 명령어를 입력하게 되면 데이터베이스의 실제 테이블을 생성하는 작업을 수행하게 된다.
작업이 완료된 것을 볼 수 있다.
api 란 뭘까?. 개발자가 필요로 하는 데이터를 뽑아낼 수 있도록 만들어 놓은 함수 또는 서버에게 혹은 데이터베이스 에게 데이터를 입력할 수 있도록 만들어 놓은 함수 같은거라 생각하면 편하겠다.
python manage.py shell 명령어를 수행하게 되면 터미널 내의 shell 로 진입한다.
from polls.models import Choice, Question
우리가 만든 모델 내에 Question, Choice 있는데 바로 이 Question 하고 Choice를 사용하겠다 라고 추가를 하는 작업이다.
그다음,
question.objects.all()
현재 question 내의 모든 데이터를 갖고 와라 라는 명령어이다.
당연 지금 등록된 question 내용이 없기 때문에 빈 내용이 보이게 된다.
다음으로 question 내의 데이터를 생성해 보도록 하자.
퀘스천 모델에는 질문내용이 하나 그리고 발행일이 있었다. 발행일 시간을 입력하기 위해서 이런 timezone 이라는 라이브러리를 임포트 하면 되겠다.
from django.utils import timezone
그리고 question을 하나 추가해 보도록 하자.
추가를 했고 q.save() 를 통해 q.id 가 1 이라는 데이터를 반환하게 되고, 이 id 는 우리가 모델을 생성할 때 명시를 하지 않더라도 장고에서 자동으로 만들어주는 필드 중에 하나 이다.
아이디는 1번 텍스트는 지금 입력한 것을 확인해 볼 수 잇다. 발행일도 볼 수 있다.
텍스트를 다른 문자열을 입력하여 변경할 수도 잇다.
question.objects.all() 을 이용하여 오브젝트가 한 개 있다 라는 것을 볼 수 있다.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
사용자가 볼 때 all 이라고 하면 (1) 이렇게 나오는데 이게 어떤 데이터인지 잘 구분이 되지 않는다.
그렇기 때문에 모델 내의 이러한 어떤 메소드를 사용하게 되면 저렇게 (1) 이런게 아니라 보고 싶은 문구를 볼 수가 있게 된다.
문구를 입력하기 전에 다시 한번 확인을 해보도록 하자.
그리고 polls/models.py 에 str 메소드를 Question과 Choice에 추가해 보자.
또한 개발자가 필요로 하는 커스텀 메소드를 입력할 수도 있다.
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
간단하게 함수를 살펴보게 되면 현재 시간 그리고 하루 전날에 대한 시간을 차감함으로써 현재로부터 하루 차감한 어제의 시간을 반환하게 되고 그리고 어제의 이후에 발행이 된 데이터가 리턴된다.
다른 모듈들이 많이 있는데 사용하면서 보고 익히는 거지 실제로는 다 알수가 없다고 한다. 그렇기 때문에 필요로 하는 내용을 그때그때 학습을 하면 된다.
변경된 사항 저장하고 다시 python manage.py shell 을 실행하겠다.
다시 실행했으므로 우리가 사용하는 모델을 임포트 하면 되겠다.
Question.objects.all() 에 대한 데이터를 보자. 아까는 (1) 이렇게 되어 있었는데, 현재는 what's up? 이라고 아까 str 메소드에 추가한 내용을 볼 수가 있게 되었다.
Question.objects.filter(id=1) 번인 데이터를 가지고 와라.
밑에는 문자열에 what 으로 시작하는 데이터를 가지고 와라 라는 거.
이러한 쿼리 내용들은 장고 docs 에 제공이 되기 때문에 필요로 하는 것을 찾아서 사용하면 된다.
실제로는 다 모르므로 필요한걸 찾다보니 많이 아는거니까 처음부터 모른다고 좌절 금지..
하지만 좌절중..