Django tutorial project - 2

minch·2021년 7월 14일
1

Django

목록 보기
3/16
post-thumbnail

Django tutorial

Install Database & Setting

mysite/settings.py을 통해 데이터베이스를 연결할 수 있다.

기본적으로는 SQLite을 사용하도록 구성되어 있다. 이는 Python에서 기본적으로 제공되기 때문에 따로 설치할 필요는 없다.

하지만 좀 더 확장성 있는 데이터베이스를 위해 다른 데이터베이스(oracle,postgresql,mysql 등)를 사용하는 것이 좋다.

그리고 settings.py 내의 Timezone을 수정하여, 시간대를 설정해주었다.

mysite/settings.py

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_L10N = True

USE_TZ = True

또, INSTALLED_APPS를 보면 django에서 기본적으로 설치되어 있는 앱들이 있고, 이곳에 우리가 만들 앱을 넣어줄 예정이다.

mysite/settings.py

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

이러한 어플리케이션은 데이터베이스의 테이블을 이용하기 때문에
다음의 명령을 실행하여, 미리 그 테이블을 만들어 놓을 필요가 있다.

$ python manage.py migrate

Make a model

모델을 만들기 위해 polls/models.py에 접근하여 다음과 같이 수정한다.

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)

모델에은 'Question'과 'Choice' 두가지 종류가 있다.

Question에는 질문 내용 텍스트와 생성 날짜가 있고,
Choice 안에는 선택지에 해당하는 질문, 답, 투표수가 있다.

question_text의 데이터 type은 CharField(문자) 최대 길이 = 200,
pub_date에 대해서는 DateTimeField(시간)을 가지고 있다.
Choice에도 보이듯 CharField, IntegerField(숫자)를 가지고 있다.

여기서, Choice 내 question에 대한 type은 ForeignKey(외래키)다.

foreignkey?

database에서 Table과 Table간에 서로 관계를 갖고 있으면, 그 관계를 연결해주는 Table의 속성을 뜻한다.

따라서, 이 ForeignKey는 위에 생성된 Question을 가리키고 있다.

또, ForeignKey로 하나의 Question에 여러 개의 Choice가 연결되므로 one to many(일대다)의 관계가 형성된다.

그리고 CASCADE는 만일 위의 Question이 삭제가 되면 Class Choice 내의 question도 삭제가 되겠다 라고 명시해준 의미이다.

이렇게 생성한 model을 활성화 하기 위해,
위에서본 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 method를 확인하면

polls/apps.py

from django.apps import AppConfig


class PollsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'polls'

위와 같이 "name = 'polls'을 참조하여 app을 등록하겠다." 라는 의미이다.

그리고 다음의 명령을 내리면,

$ python manage.py makemigrations polls

출력

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

내가 모델을 변경한 사실(위 경우엔 새로운 모델을 만듦)과 이 변경사항을 migration으로 저장하고 싶다는 것을 Django에게 알리게된다.

migration은 Django가 모델(및 데이터베이스 스키마)에 대한 변경 사항을 저장하는 방법이다. 이것은 디스크에 파일 polls/migrations/0001_initial.py로 저장된다.
원하는 경우 새 모델에 대한 migration을 읽을 수 있다.

참고로 migration이 내부적으로 어떤 SQL 문장을 실행하는지 살펴볼 수 있는데,
아래 명령어를 입력하면,

$ python manage.py sqlmigrate polls 0001

출력

Create model Question

CREATE TABLE `polls_question` (
	`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY,
    	`question_text` varchar(200) NOT NULL,
        `pub_date` datetime(6) NOT NULL
        );

Create model Choice

CREATE TABLE `polls_choice` (
	`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY,
    	`choice_text` varchar(200) NOT NULL,
        `votes` integer NOT NULL,
        `question_id` bigint NOT NULL
        );
        
ALTER TABLE `polls_choice` 
  ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` 
  	FOREIGN KEY (`question_id`)
    	REFERENCES `polls_question` (`id`);

이런식으로 SQL이 실행되는 것을 확인해 볼 수 있다.

이렇게 확인한 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

Using Django API

$ python manage.py shell

위의 명령어를 실행시켜 쉘에 진입하고 데이터베이스 API를 활용해 볼 수 있다.

실행하기 전에,

polls/models.py

from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

__str__() 메소드를 추가하는 것은 객체의 표현을 대화식 프롬프트에서 편하게 보려는 이유 말고도, Django 가 자동으로 생성하는 관리 사이트에서도 객체의 표현이 사용된다.

쉘의 명령어에 대한 설명은
첫 번째 장고 앱 작성하기, part.2에서 'API 가지고 놀기' 부분을 참고하였다.

쉘을 이용하여

Question = "What's up?"
Choice = "Not much", "The sky"

를 추가해주었다.

Start admin server

일단 admin server에 접속하기 전에,

관리자를 생성해주어야 한다.

$ python manage.py createsuperuser

명령어를 입력하고,

Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********

Username, Email, Password를 차례로 입력해주면,
관리자가 생성이 된다.

그 후, 서버를 실행하고

$ python manage.py runserver

http://127.0.0.1:8000/admin/ 이런 형태와 같은 <</admin/>>으로 Django에서 제공하는 관리자 사이트에 접속이 가능하다.

위에서 만든 관리자로 로그인을 해주면, 아래와 같은 페이지가 보일 것이다.

여기에 polls app에 대한 관리자 페이지가 없는데,

polls/admin.py

from django.contrib import admin

from .models import Question

admin.site.register(Question)

admin.py를 열고 Question objects에 대한 관리 인터페이스가 있음을 관리자에게 알려야 한다.

이렇게 되면,

polls app에 대한 관리자 페이지가 생성이 되고, 질문에 대한 수정이 가능하다.

참조
(https://docs.djangoproject.com/ko/3.1/intro/tutorial02/)

0개의 댓글