TIL27 - Django Tutorial(2)

Kiyong Lee·2021년 9월 7일
0

Django

목록 보기
2/35

Django Tutorial(2)

1. 데이터베이스 설치

mysite/settings.py는 장고 설정을 모듈 변수로 표현한 모듈이다.

기본적으로는 SQLite를 사용하도록 구성되어 있으며, 이건 파이썬에서 기본으로
제공하기 때문에 따로 설치할 필요 없다.
허나, 확장성이 더 있는 PostgreSQL 같은 DB 사용하는 거도 좋다 ^^7

다른 데이터베이스를 사용해보고 싶다면 적절한 데이터베이스 바인딩을 설치하면 된다.
그에 맞게 디폴트 항목의 값을 다음의 키 값으로 바꿔주면 된다.

ENGIN

SQLite3 : django.db.backends.sqlite3
Postresql : django.db.backends.postgresql
MySql : django.db.backends.mysql
Oracle : django.db.backends.oracle

나머지는 여기서...

NAME
말 그대로 데이터베이스의 이름이다.
만약 SQLite를 쓴다면, 그에 맞게 데이터베이스가 생성될 것이다.
이름의 경우 파일명을 포함하여 절대 경로가 되어야 한다.
이름의 기본값은 BASE_DIR/'db_sqlite3'이 내 프로젝트 디렉토리에
저장될 것이다.

SQLite를 데이터베이스로 사용하지 않는 경우, USER/PASSWORD/HOST 같은
추가설정이 반드시 필요하다.
더 자세한 내용은 여기 참조

기본 값으로는 이렇게 되어 있다.

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

setting.py를 편집할 때, TIME_ZONE 값을 설정해야 한다.

그리고 이 파일에 있는 INSTALLED_APPS에 대해 설명하자면
이 변수안에, 모든 장고 어플리케이션의 이름이 담겨 있다.
앱들은 다수 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용될 수 있도록
패키징하여 배포할 수 있다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

위 값들에 대해 설명을 해보자면

django.contrib.admin
: 관리용 사이트 ( 곧 사용 예정 )

django.contrib.auth
: 인증 시스템

django.contrib.contenttypes
: 컨텐츠 타입을 위한 프레임워크

django.contrib.sessions
: 세션 프레임워크

django.contrib.messages
: 메시징 프레임워크

django.contrib.staticfiles
: 정적 파일을 관리하는 프레임워크

이 애플리케이션들은 일반적인 경우에 사용하기 편리하도록 기본 제공된다.

그러면 이제 데이터베이스의 테이블을 만들어서 직접 사용해보자!


2. Database

mysite로 가서 아래 문구를 터미널에서 입력해보자

python manage.py migrate

그러면 ㅇㅋㅇㅋㅇㅋ가 계속 나오는 걸 확인할 수 있다.

그러면 여기서 mirgate가 뭘까?

데이터베이스 내에서 변경이 발생했을 때, 변경사항을 적용한다

라는 뜻이다.

추후에 배울 내용이지만, ORM을 사용하기 때문에 models.py와 클래스를 통해
DB스키마를 생성하고 컨트롤하게 되는데, 이 때 DB스키마를 git처럼 버전으로
나눠서 관리 할 수 있게 해 주는 시스템이라고 길게 알고 있어도 된다

스키마(schema)
: 데이터베이스 내에서 데이터가 저장되는 구조와 제약 조건을 정의한 것
장고로치면 models.py 파일

마이그레이션 관련 명령어는 여기서 더..


3. 모델 만들기

우선 모델이 무엇일까?

부가적인 메타데이터를 가진 데이터베이스 구조를 말한다.

메타데이터
: 데이터에 대한 데이터 라는 뜻으로, 특수 목적을 가지고 만들어진 데이터
라고도 한다.
예시로 파일 생성 날짜, 파일 생성 시간 등이 있다.

모델은 내가 저장하는 데이터의 필수적인 필드들과 실행들을 포함하고 있다.
장고는 DRY원칙(Dont Repeat Yourself)을 따르기 때문에, 데이터 모델을 한 곳에서 정의하고
이것으로부터 자동으로 뭔가 유도하는 것이 목표이다.

이제 우리는 polls에서 QuestionChoice라는 두 개의 모델을 만들 것이다.

Question은 텍스트 형태의 질문과 날짜형태의 대답이라는 변수를 가지고 있다.
Choice는 선택/투표계정이라는 두 개의 값을 가지고 있다.
각각의 ChoiceQuestion과 연결되어 있다.

그래서 polls/models.py를 입력해보자

from django.db import models

# Create your models here.
class Question(models.Model) :
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date pubilshed')

class Choice(models.Model) :
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

데이터베이스의 각 변수(인스턴스명)는 Field 클래스의 인스턴스로서 표현된다.
CharField는 문자를, DateTimeField는 날짜와 시간을 표현한다.
즉, 각 변수가 어떠한 자료형을 갖는지 장고에게 말해주는 것!

다른 변수가 어떻게 할당되었는지 알겠는 것과 달리
models.ForeignKey()에 대해 설명이 필요할 것 같다.

우리가 설문조사를 할 때 생각해보자
하나의 질문에 답을 해서 제출했다면?
그건 되돌릴 수 없으며, 질문과 답변을 1대1이라고 설정해주기 위한 코드이다.
시험에서 1번문제가 갑자기 14번에 등장하면 안되는 것처럼!


4. 모델의 활성화

이 모듈에서 작성된 작은 코드가, 장고에게는 상당한 양의 정보를 전달한다.
이 코드만을 가지고 장고가 할 수 있는 일은 다음과 같다

 1. 이 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE)
2. QuestionChoice 객체에 접근하기 위한
     Python 데이터베이스 접근 API 생성

그 전에, 현재 프로젝트에게 polls앱이 설치되어 있다는 걸 알려야 한다.

polls앱을 현재 프로젝트에 포함시키기 위해, 앱의 구성 클래스에 대한 참조를
INSTALL_APPS 설정에 추가해야 한다.

PollsConfigpolls/apps.py에 존재하기 때문에
경로는 polls.apps.PollsConfig가 되어야 한다.
이 경로를 INSTALL_APPS에 추가하면 된다.

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

이제 장고는 polls앱이 포함된 걸 알게 되었으니, 아래 명령을 내려보자

python manage.py makemigrations polls

아무것도 안 만지고 그대로 입력했을 때 나는 이상한 에러가 떴었다

no module named 'mysite.polls'

이게 왜 그런지 나도 찾아봤는데, 여기에 나와 같은 문제를 겪은 분이 있었다

디렉토리명이 같아 충돌이 발생한 것이었으며 나는 최상위 폴더를 mysites
바꿨다.

위 명령어를 제대로 입력하면 아래와 같은 문구가 나온다고 한다.

짜잔!

이렇게 makemigrations 실행시킴으로써 모델을 변경시킨 사실과 이 변경사항을
migration으로 저장하고 싶다는 사실을 장고에게 알려준다.

이렇게 migration을 실행하고 자동으로 DB Schema를 관리해주는 명령어가 있다.

python manage.py sqlmigrate polls 0001

읽어보니 QuestionChoice에 대해 테이블을 생성하고,
어제 models.py에서 걸어준 질의응답 관계에 대해 제약조건 추가하는 것까지
3가지 쿼리가 작성되었다.

그리고 manage.py에 대해 이슈가 있는지 체크를 하려면 아래 명령어를 입력하면 된다.

python manage.py check

그러면 현재 식별된 이슈가 없다! 라고 뜨는 걸 확인할 수 있다.

이제 migrate를 시켜, 데이터베이스 모델과 관련된 테이블을 생성해보자

다시 한 번 되새김질 할겸해서 명령어를 써보자면

python manage.py migrate

migrate 기능은 매우 강력하며, 모델의 반복적인 변경을 가능하게 해준다.
동작중인 데이터베이스를 자료 손실 없이 업그레이드하는데 최적화 되어 있으며,
튜토리얼의 나머지 부분에서 이후 부분을 살펴보겠지만
모델의 변경을 만드는 세가지 순서는 꼭 기억하자!

1. models.py에서 모델을 변경
2. python manage.py makemigrations 실행
3. python manage.py migrate를 통해 적용


5. API 가지고 놀기

python 쉘을 이용해 장고의 API를 가지고 놀아보자!

그러기 위해선 아래 명령어를 입력해보자

python manage.py shell

상호작용됐다는 문구가 나오고 아래에 이 쿼리들을 입력해주면 된다.

Question.objects.all() 을 입력하면 나오는 <QuerySet ... 어쩌구.. 이부분은
객체 표현하는데 도움이 되지 않는다.

그래서 Question모델을 직접 수정할 예정이다.

class Question(models.Model) :
	#기존에 작성된 question_text , pub_date
    #__str__  추가
    def __str__(self) :
    	return self.question_text
      
 
 class Choice(models.Model) :
 	#기존에 작성된 question & choice_text & votes
    #__str__ 추가
    def __str__(self) :
    	return self.choice_text

슈퍼메소드 str을 추가하는 것은 장고가 자동으로 생성하는 관리사이트에서도
객체의 표현이 사용되기 때문이다.

polls/models.py에 커스텀 메소드도 추가해보자

import datetime
from django.db import models
from django.utils import timezone

class Question(models.Model) :
# ...
	def was_published_recently(self) :
    	return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

import datetime
: 파이썬의 표준 모듈인 datetime 모듈 참조

from django.utils import timezone
: 장고의 시간대 관련 유틸리티인 django.utils.timezone 참조

코드 작성 후 저장한 다음 아래 명령어를 다시 실행해보자

python manage.py shell

그 다음 터미널에 장고 튜토리얼 페이지에 있는 명령어를 쭉 입력해보면 된다.


6. 장고 관리자 소개

사이트 관리를 위한 관리자를 생성해보자

6-1. 관리자 생성하기

아래 명령어를 통해 계정을 생성

python manage.py createsuperuser

원하는 유저이름을 입력하고 엔터를 누르자

Username : admin

원하는 이메일 주소를 입력하라는 메시지가 표시된다.

Email address : admin@example.com

이렇게 입력하면 성공적으로 생성되었다는 말이 나온다.


6-2. 개발서버 시작

서버를 켜보자(이쯤되면 이 명령어를 외우게 된다;;)

localhost:8000/admin에 들어가면 다음과 같은 화면이 나온다.

여기서 내가 계정을 만들 때 생성한 이름과 비밀번호를 입력하고 들어가면

짜잔하고 인덱스가 나온다.

편집 가능한 그룹과 사용자같은 컨텐츠가 있는데, 이것들은

django.contrib.auth

모듈을 통해 제공된다.


6-3. 관리사이트에서 poll app을 변경가능하도록 만들기

poll app이 관리 인덱스 페이지에서 보이지 않네요

라고 하는데 무슨말인고 하니, 질문들에 대한 내용이 보이지 않는다는 것;;
어쨌든 이걸 해결하기 위해 polls/admin.py를 일부 수정해야 한다.

from django.contrib import admin
from .models import Question

admin.site.register(Question)

새로고침을 했더니 아래 POLLS가 생긴 걸 확인할 수 있다.

그래서 Questions를 누르면 질문들을 위한 change list로 이동한다

이 페이지는 데이터베이스에 저장된 모든 질문들을 보여주며, 그 중 하나를 선택하여
변경할 수 있다.

그리고 이전에 등록했던 What's Up? 이라는 질문도 있다.

이제 이 질문을 클릭하여 수정해보자

그럼 바뀐게 확인된다.


튜토리얼 3과 4가 남았는데, 1과 2 이해도 제대로 안 된 상황이기 때문에
아마 안 하지 싶다;;

profile
ISTJ인 K-개발자

0개의 댓글