Django Model
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에 테이블로 구현한다.
댓글남기기