IT/Web programming

장고(Django) 모델로 데이터베이스 관리하기 1: Model

히비스커스레몬 2022. 2. 23. 16:42
반응형

cf. 설치된 앱과 데이터베이스 정보 확인하기

config/settings.py파일을 열어 확인할 수 있다.

admin, auth, contenttypes, sessions,messages,staticfiles 앱이 기본으로 설치되어 있음을 볼 수 있다.

# Application definition

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

...생략...

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

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

 

cf. migrate로 테이블 생성 하기

사실 서버 구동할때 살짝쿵 무시해왔던게 있다.

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.

 

migration이 뭘까하고 검색해봤더니 "이주"라는 뜻으로... 데이터베이스에 테이블, 필드 등의 변경이 발생했을 때 지정된 데이터베이스에 적용 하는 과정을 의미하며 model.py에 정의된 모델의 생성/변경 내역을 관리, 데이터 베이스에 적용하는 기능을 제공하여 손쉽게 데이터베이스의 구조를 바꿀 수 있게 한다....라고 한다.

뭔지 잘 모르겠다

장고에서 제공하는 데이터베이스(sqlite)에서 사용할 테이블을 생성하는 밑바탕작업...정도로 이해하고 넘어갔다.

 

 

migrate 명령을 통해 기본으로 설치되어 있는 admin, auth, contenttypes, sessions앱이 필요한 테이블을 생성했다.

(messages,staticfiles앱은 데이터베이스와 무관하므로 배제되었다)

PS C:\DjangoProject\mysite> python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... O
K
  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

모델 생성하기

위의 내용을 숙지했다면 이제 모델을 만들 수 있다.

파이보를 질문답변게시판으로 만들기 위해 질문과 답변 모델을 만들어 볼 것이다.

 

1.pybo/models.py에 질문답변모델 작성하기

from django.db import models

# Create your models here.
class Question(models.Model):  #질문모델 생성
    subject=models.CharField(max_length=200) #속성1. 제목
    content=models.TextField() #속성2. 내용
    create_date=models.DateTimeField() #속성3. 작성일시
    
    def __str__(self):
    	return self.subject

class Answer(models.Model):  #답변모델 생성
    question=models.ForeignKey(Question, on_delete=models.CASCADE) #속성1. 질문
    content=models.TextField() #속성2.내용
    create_date=models.DateTimeField() #속성3. 작성일시
    
    def __str__(self):
    	return self.subject   #데이터 조회시 id가 아닌 제목을 표시해줌

답변모델은 어떤질문의 답변인지 알기 위해 질문모델을 속성으로 사용해야한다.

이때 다른모델과의 연결을 위해 ForeignKey를 사용함을 알아두자.

 

 

2.config/settings.py에 pybo앱 등록하기

장고는 모델을 이용하여 데이터베이스의 실체가 될 테이블을 만드는데, 모델은 앱에 종속되어 있다.

그러므로 pybo/models을 인식하기 위해선 pybo/apps를 등록해야한다.

 

pybo/apps을 열어보자. pybo앱을 만들때 자동으로 생성된 PyboConfig클래스를 확인할 수있다.

from django.apps import AppConfig


class PyboConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'pybo'

PyboConfig클래스를 장고가 인식하고 데이터베이스 작업을 할 수 있도록 config/settings.py에 pybo앱을 등록한다.

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

 

3. migrate로 테이블 생성하기

PS C:\DjangoProject\mysite> python manage.py makemigrations

Migrations for 'pybo':
  pybo\migrations\0001_initial.py
    - Create model Question      
    - Create model Answer 
    
    
PS C:\DjangoProject\mysite> python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, pybo, ses
sions
Running migrations:
  Applying pybo.0001_initial... OK

모델이 생성되거나 변경된 경우 먼저 makemigrations 명령으로 테이블작업 수행을 위한 파일을 생성한다. 

그 후 migrate 명령을 실행하면 장고는 등록된 앱에 있는 모델을 참고하여 실제 테이블을 생성한다.

 

 

 

▼Reference

https://tutorial.djangogirls.org/ko/django_models/

반응형