int main()/django

[ django ] 설문 조사 만들기 2 (데이터베이스 설치)

여행의책 2023. 8. 10. 14:52
반응형

아무것도 건드리지 않았다면 django에서는 기본적으로 sqlite3을 사용한다.

testProj/setting.py를 확인해보면 아래와 같이 데이터베이스를 설정하는 부분이 있다.

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

mysql이나 다른 데이터베이스를 이용하려면 아래와 같이 변경하면 된다.(아래는 mysql을 사용한 예이다.)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # mysql 사용
        'NAME': 'dbname', # 데이터베이스 이름
        'USER': 'root', # 사용자명
        'PASSWORD': 'xxxx', # 사용자 비밀번호
        'HOST': 'localhost', # 호스트 명(URL이나 IP)
        'PORT': '3306',
    }
}

1. 모델 만들기

   - 설문 조사 앱에서 Question과 Choice라는 두 가지 모델을 만들다.

   - 모델을 만드는 곳은 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)

   - Quesion에는 내용과 등록 날짜만 있다.

   - Choice에는 ForeignKey를 이용하여 Question과 연결하고, 선택 내용과 선택 수를 정의한다.

 

2. 모델 활성화

   - 먼저 polls앱을 사용하겠다고 알려주어야 한다.

   - testProj/setting.py에 등록 해주어야 한다.

      등록 해줄때는 앱 이름만 작성해도 되고, 앱 경로를 포함한 풀네임으로 적어주어도 된다.(주석 처리한 부분 참고)

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

    #user app
    'polls',
    #"polls.apps.PollsConfig",
]

   - polls 앱을 등록했다면 migrations를 해보자.

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

   - makemigrations을 실행시키면, 모델의 변경 사항(지금은 새로운 모델을 만들어진다.)을 django에게 알려준다.

   - 변경사항을 django에게 알려줬다면 실제로 데이터베이스를 만들기 위해서는 migrate를 하면 된다.

$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  ...(중략)
  Applying polls.0001_initial... OK
  Applying sessions.0001_initial... OK
  Rendering model states... DONE
  Applying polls.0001_initial... OK

   - migrate를 실행시키면 데이터베이스에 모델과 관련된 테이블을 생성한다.

   - polls 이외의 내용도 보인다. 사용자나 설정등 django에서 기본적으로 필요한 테이블들을 내 의지와는 상관없이 만들어 준다.

   - polls가 어떻게 만들어져 있는지 확인하는 방법은 다음과 같다.

$ python3 manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
   "question_text" varchar(200) NOT NULL, 
   "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
   "choice_text" varchar(200) NOT NULL, 
   "votes" integer NOT NULL, 
   "question_id" bigint NOT NULL REFERENCES "polls_question" ("id") 
   DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;

3. 모델 확인(쉘창에서 확인해 보자.)

   - 모델이 정상적으로 만들어졌는지 확인해보자.(DB Browser for SQLite 같은 툴을 이용할 수도 있다.)

$ python3 manage.py shell
Python 3.12.0b3 (v3.12.0b3:f992a60014, Jun 19 2023, 18:05:04) [Clang 13.0.0 (clang-1300.0.29.30)] 
on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet []>

   - Question의 모든 내용을 불러왔다. 금방 만들어진 따끈따끈한 데이터베이스라 아무것도 없다는 내용을 보여준다.

   - 결과는 Queryset으로 보여준다.

   - 그럼 질문 하나를 저장해 보자.

>>> from django.utils import timezone
>>> q = Question(question_text="내용은 뭐가 좋을까?", pub_date=timezone.now())
>>> q.save()
>>> q.id
1
>>> q.question_text
'내용은 뭐가 좋을까?'
>>> q.pub_date
datetime.datetime(2023, 8, 10, 5, 8, 7, 674626, tzinfo=datetime.timezone.utc)
>>> q.question_text = "내용을 바꿔볼까?"
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

   - 내용 하나를 저장해 보고, 변경까지 해보았다.

   - 결과를 보니... <Question: Question object (1)> 와 같이 아이디를 출력한다. 아이디보다는 내용을 보고 싶다면 다음과 같이 한다.

   - polls/models.py를 수정한다.

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


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

   - __str__()을 작성해 주면 프롬프트에서 편하게 보는 것도 있지만, django에서 제공해 주는 관리 페이지에서도 적용된다.

   - 쉘 프롬프트를 종료 후 다시 시작해서 확인해본다.

>>> quit()
$ python3 manage.py shell
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet [<Question: 내용을 바꿔볼까?>]>

   - 결과는 아이디 대신 내용이 보인다.

 

4. 관리자 생성 및 관리 페이지 확인

   - 커스텀 유저를 별도로 만들지 않았다면 django에서 만들어준다. ( 알아서 만들어준다니 편하긴 한데... 마냥 좋지만은 않다.)

   - 관리자 계정 만들기

$ python3 manage.py createsuperuser
Username (leave blank to use 'tory'): tory
Email address: tory@tory.com
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

   - python3 manage.py createsuperuser 는 관리자 계정을 만들어 달라는 것이다.

   - 로그인 ID로 사용할 Username, 이메일, 패스워드를 요구한다.

   - 그 밑에 나오는 건 패스워드가 너무 짧다, 알기 쉽다 그래도 사용하겠냐? 이런 내용인데, 테스트용이니 그대로 사용하겠다고 'y'를 입력하면 된다. 잘 만들어졌다는 메시지까지 확인했다.

   - 이제 서버를 실행하고 관리자 페이지( 127.0.0.1:8000/admin/ )에 접속해 보자.

$ python3 manage.py runserver

   - 조금 전 만들었던 관리자 계정으로 로그인해본다.

   - 들어와 보니, 우리가 만들어놓은 Question과 Choice가 보이지 않는다. 

   - 관리자 페이지에 Question과 Choice를 보이게 해 보자.

   - polls/admin.py를 수정한다.

from django.contrib import admin

from .models import Question

admin.site.register(Question)

   - 다시 관리자 페이지에 접속해 본다.

   - 아주 잘~~ 보인다. (관리자 페이지 이곳저곳을 돌아다니며 가지고 놀아보면 된다.)

 

이상~~ 오늘은 여기까지~~