🔗 Django 001 | 공식 문서 따라하기 #1에 이어서 작성된 포스트입니다.
🔗 첫 번째 장고 앱 작성하기, part 2 공식문서를 따라하며 작성된 글입니다.
python은 기본적으로 SQLite를 제공하기때문에 별도의 데이터베이스를 설치할 필요가 없다.
❗️ 공식문서의 내용은 SQLite를 기반으로 작성되었지만 MySQL을 사용해보록 하겠습니다.
다음의 명령어로 MySQL 설치한다.
brew install mysql
다음의 명령어로 MySQL 기본 설정을 시작한다.
mysql_secure_installation
mysql.server start
mysql -u root -p
-u : MySQL에 접속할 사용자의 아이디를 명시하는 옵션 (여기서는 root사용자로 접속)
-p : 비밀번호를 직접 입력하겠다고 명시하는 옵션
MySQL 데이터베이스 생성
create database [db_name] character set utf8mb4 collate utf8mb4_general_ci;
show databases;
use [db_name]
show tables;
⬆️ 데이터베이스 안에 테이블을 설정해주지 않아 비어있는 모습 ⬆️
mysite/settings.py에 다음내용을 작성한다.
하지만 위와 같은 정보(데이터베이스 패스워드 등)는 중요한 정보이므로 github등으로 코드를 관리시에는 반드시 중요 정보를 가려주어야 한다.
manage.py와 같은 위치에 my_settings.py 파일 만들기
touch my_settings.py
my_settings.py에 다음 내용 작성
settings.py 수정하기
데이터베이스 migration 전 mysqlclient를 설치한다
pip3 install mysqlclient
데이터베이스에 테이블을 생성하기 위해 다음 명령을 실행한다.
python3 manage.py migrate
MySQL 에서 migrate된 테이블들을 확인 가능하다.
migrate명령은 INSTALLED_APPS설정을 살펴보고 mysite/settings.py파일의 데이터베이스 설정과 앱과 함께 제공되는 데이터베이스 마이그레이션에 따라 필요한 데이터베이스 테이블을 생성한다.
모델이란 부가적인 메타데이터를 가진 데이터 베이스의 구조를 말한다.
django 튜토리얼 설문조사 앱 만들기에서는 두가지 모델을 만든다.
A Question은 질문과, 발행일을 가지고 있고, A Choice는 선택지와 총 투표양을 가지고 있다.
A Question과 A Choice는 서로 연결되어있다.
polls/models.py를 열어 다음과 같이 작성한다.
각 모델은 django.db.models의 하위 클래스로 표현된다.
각 모델에는 여러개의 클래스 변수가 있으며 각 변수는 모델의 데이터베이스 필드를 나타낸다.
다음은 각 필드가 어떤 자료형을 가질 수 있는지 django에게 전해준다.
CharField
: 문자 fieldDateTimeField
: 날짜와 시간(datetime) field정리하자면 question_text
field는 최대 200자의 문자형 자료형을 가질 수 있고(CharField
의 경우 max_length
를 입력해 주어야한다), pub_date
field는 날짜와 시간 자료형을 저장할 수 있다는것을 뜻한다.
필드들은 defalut
처럼 다양한 선택적 인수들을 가질 수도 있다.
앞서 작성한 모델에 대한 코드로 django는 다음과 같은 일을 할 수 있다.
django가 위와 같은 일을 할 수 있도록 하려면 앱의 구성 클래스에 대한 참조를 INSTALLED_APPS설정에 추가해야 한다.
PollsConfig클래스는 polls/apps.py 파일 내에 존재한다.
이 경로를 mysite/settings.py파일의 INSTALLED_APPS에 다음과 같이 추가한다.
makemigration명령으로 새로운 모델을 만들었고 이 변경사항을 migration으로 저장시키고 싶다는 것을 django에 알려줄 수 있다.
python3 manage.py makemigrations polls
migration ?
migration은 django가 모델및 데이터베이스 스키마에 대한 변경사항을 저장하는 방식이다.
migrate : migration을 실행시켜주고, 자동으로 데이터 베이스 스키마를 관리해주는 명령어
sqlmigrate : mygration이름을 인수로 받아 실행하는 SQL문장을 보여준다
- 테이블의 이름은 앱의 이름과 모델의 이름이 자동으로 조합되어 생성된다 (polls_question, polls_choice) 재 지정하여 수정 가능
- 기본 키(ID)가 자동으로 추가된다. 재 지정하여 수정 가능
- foreign key relationship은 FOREIGN KEY제약 조건에 의해 명시된다.
- 사용하는 데이터베이스에 따라 데이터 베이스 고유의 필드 타입이 조정된다.
- sqlmigration 명령은 데이터베이스에서 마이그레이션을 실제로 실행하지는 않지만, SQL django가 필요하다고 생각하는 바를 확인할 수 있도록 마이그레이션 명령을 화면에 인쇄한다. django가 수행할 작업이나 변경에 SQL 스크립트가 필요한 데이터베이스 관리자가 있는지 확인하는 데 유용하다.
다음의 명령어를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성할 수 있고, 데이터베이스에서 생성된 테이블을 확인 가능하다.
python3 manage.py migrate
python 쉘을 사용하여 django API를 사용 할 수 있다.
python 쉘은 다음 명령어로 실행시킨다.
python3 manage.py shell
# Import the model classes we just wrote
>>> from polls.models import Choice, Question
>>> Question.objects.all()
데이터베이스가 비어있으므로 아무것도 출력되지 않는다.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# Save the object into the database.
>>> q.save()
shell에서 작성한 명령어가 MySQL 데이터베이스에 저장된 것을 볼 수 있다.
>>> q.question_text = "what's up"
# Save the object into the database.
>>> q.save()
shell에서 저장된 question_text
를 수정하는 것도 가능하다.
다음의 명령어를 통해 Question에 저장된 객체의 갯수를 확인할 수 있다.
>>> Question.objects.all()
하지만 <Question: Question object (1)> 은 객체를 표현하는데 직관적이지 않다.
모델에 __str__() 메소드를 추가하는 것은 객체의 표현을 대화식 프롬포트에서 편하게 보려는 이유뿐 아니라 Django가 자동으로 생성하는 관리 사이트에서도 객체의 표현이 사용되기 때문이다.
import datetime
: python표준 모듈인 datetime모듈
from django.utils import timezone
: django의 시간대 관련 유틸리티
변경된 사항을 저장 후 다음을 실행한다.
python manage.py shell
>>> from polls.models import Choice, Question
>>> Question.objects.filter(id=1)
앞 전의 결과와는 다르게 데이터베이스에 저장된 객체의 내용을 확인 할 수 있다.
존재하지 않는 id를 사용하여 객체를 가져올 경우 polls.models.Question.DoesNotExist
를 반환한다.
커스텀 한 메소드 was_published_recently()
도 동작한다.
다음의 명령어는 pk=1
인 question의 choice객체를 모두 가져온다.
아직 저장된 choice가 없으므로 빈 리스트를 반환한다.
다음의 명령어로 choice를 생성할 수 있다.
데이터베이스에 저장된 choice들을 확인할 수 있다. 각 choice들은 pk=1
인 question_id를 foreign-key로 가지고 있다.
filter
와 delete
로 원하는 choice를 삭제할수도 있다.
데이터베이스 내에서도 삭제된 모습을 확인할 수 있다.
django는 모델에 대한 관리용 인터페이스를 모두 자동으로 생성해 준다.
관리자 사이트는 사이트 방문자를 위한 것이 아니라, 사이트 관리자를 위한 것이다.
다음과 같은 명령을 수행해 관리 사이트에 로그인 할 수 있는 사용자를 생성할 수 있다.
python manage.py createuperuser
비밀번호를 임시로 12345
를 사용했더니 경고창이 나왔다.
비밀번호의 유효성 검사 로직은 다음과 같을 것으로 예상한다.
튜토리얼을 학습하는 용으로 생성한 관리자이기때문에 Bypass password validation and create user anyway?(유효성 검사를 건너뛰고 유저를 생성하겠습니까?)
에 y
로 답했다.
서버가 꺼져있다면 runserver
로 서버 실행 후
http://127.0.0.1:8000/admin/
로 이동하면 django administration 로그인 창이 나온다.
앞서 생성한 슈퍼유저(superuser)계정으로 로그인 하면 다음과 같은 django 관리 인덱스 화면이 나온다.
관리 사이트에서 poll app을 변경가능하도록 만드려면 polls/admin.py파일을 다음과 같이 작성한다.
이제 관리 사이트에서 polls를 확인할 수 있다.
Question을 클릭하면 질문들을 위한 change list로 이동한다. 데이터베이스에 저장된 질문들을 보여주며 그 중 하나를 선택하여 변경할 수 있다. 전에 데이터베이스에 저장한 What's up
을 볼 수 있다.
What's up
을 클릭하면 text
, Date published
항목을 수정할 수 있다. Now를 클릭하면 현재시간으로 설정할 수 있다. SAVE버튼을 눌러 변경사항을 저장한다.
수정된 내용도 데이터베이스에 반영된다.
HISTORY 버튼을 눌러 누가 언제 무엇을 바꾸었는지 확인할 수 있다.