2 분 소요

Model

이 글은 박응용 님의 wikidocs 의 점프 투 장고 교재를 학습하며 작성한 글 입니다.

django 의 디자인 패턴중 DB를 처리하고 관리하는 기능을 하는 Model에 대해서 알아보자.

디자인 패턴에 대한 부분은 다른 글에서 정리를 해보겠다.

django 는 ORM(Object Relational Mapping) 이 존재하여 SQL의 번거로움 없이 객체와 DB를 연동하여 사용할 수 있는 장점이 있다.

질문 답변 데이터를 구현해보며 학습해보자.

settings.py 확인

프로젝트 디렉토리 내에 settings.py 를 확인하면 본인이 만든 app 외에 여러 app이 존재하는 걸 알 수 있다.

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

해당 app중에는 DB를 필요로 하는 app들이 있다.

파일을 좀 더 살펴보면 DB에 대한 부분이 있다.

# settings.py

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

ENGINE 은 말 그대로 DB의 종류를 얘기하며 SQLite3 으로 설정되어있다.

NAME 은 DB가 저장될 위치와 DB 파일명을 명시한다.

BASE_DIR 은 프로젝트 디렉토리를 의미한다.

migrate

이제 settings.py를 확인했으니 app에 필요한 DB를 구성해보자.

django의 강력한 기능인 migrate 를 통해 SQL 문으로 테이블을 생성하지 않아도 setting.py에 명시된 app중 DB가 필요한 app에 맞춰서 테이블이 생성된다.

python manage.py migrate



위 명령을 입력해주면 데이터 테이블이 설치된다.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

위의 메시지를 통해 DB가 정상적으로 셋팅 된 것을 확인할 수있다.

DB 내부를 확인 하고 싶다면 https://sqlitebrowser.org/dl/ 에 접속하여 DB Broswer for SQLite 를 다운 받은 후 DB파일을 열어보면 된다.

모델 만들기

이제 기존에 존재하던 app이 아니라 저번에 만들어두었던 community app을 목적에 맞게 모델을 만들어 DB까지 생성해보자.

우선 질문과 답변에 따른 속성을 구성해보자.

  • 질문
속성명 설명
subject 질문 제목
content 질문의 내용
create_date 질문 작성 날짜
  • 답변
속성명 설명
question 질문
content 답변 내용
create_date 답변 작성 날짜

model.py

위의 데이터 모델을 model.py 에 정의해보도록 하자.

# model.py

from django.db import models

class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()


class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()

위에 정의한 클래스 하나 하나가 DB에 테이블이 되는 것이다.

그리고 클래스 내부에서 칼럼을 정의해준다.

Answer의 question 같은 경우는 질문이 있어야 답변이 존재 함으로 Question 모델과 종속 관계라 할 수 있다.

그러므로 Foreignkey를 이용해 Qusetion 모델과 연결해준다.

더 자세한 django의 속성 타입에 대한 공식 문서는 아래 링크에서 확인 할 수 있다.

https://docs.djangoproject.com/en/3.0/ref/models/fields/#field-types

app 등록

작성한 모델의 테이블을 생성하기 전에 migrate 기능을 사용하기 위해서 settings.py에 app을 추가해주자.

우선 app디렉토리 내부에 app.py 파일을 통해 config 클래스를 확인해보자.

from django.apps import AppConfig


class CommunityConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'community'

위의 config 정보를 settings.py 에 정의함으로서 migrate가 실행되었을 때 해당 config로 접근하여 DB를 셋팅한다.

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

위에처럼 app config 클래스를 추가해주고 migrate명령어를 사용해보자

makemigrations

DB를 생성할 때는 위에서 본 것처럼 migrate 명령어를 이용하지만 지금처럼 DB가 처음 초기화 된 이후에 새로운 DB를 추가 또는 수정하기 위해선 별도의 작업이 필요하다.

(venv) C:>python manage.py makemigrations
Migrations for 'community':
  community\migrations\0001_initial.py
    - Create model Question
    - Create model Answer

위 터미널처럼 makemigrations 을 이용하여 변경사항을 업데이트 해주어야한다.

마치 git add 를 통해 staging area에 변경사항을 올리는 것처럼 새로 추가되거나 변경된 모델을 파악하여 initial.py 로 테이블을 만들기 위한 사전 준비를 해준다.

(venv) C:>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, community, contenttypes, sessions
Running migrations:
  Applying community.0001_initial... OK

마지막으로 migrate 명령어로 모델을 DB에 테이블로 구현한다.

댓글남기기