👓

003. 모델 작성하기

1. 모델(model) 이란?

Django에서 모델은 데이터베이스에 저장될 테이블을 정의하는 클래스입니다. django에서는 SQL을 직접 작성하지 않아도 모델을 저장하면 DB에 저장됩니다. (여기서 SQL이란 관계형 데이터베이스 관리 시스템으로, 데이터를 관리하기 위해 설계된 특수목적의 프로그래밍 언어입니다.)
그렇다면 데이터베이스에는 어떤것이 들어있을까요? 사용자에 대한 ID, PW 등 개인 정보나, 우리가 만들 테스트지의 문항, 그 결과값 등 다양한 데이터들이 저장되어 있습니다.

2. 모델 작성

우리가 작성하고자 하는 모델의 설계는 다음과 같습니다.
해당 DB설계는 erdcloud 에서 작성했습니다.해당 DB설계는 erdcloud 에서 작성했습니다.
해당 DB설계는 erdcloud 에서 작성했습니다.
모델 클래스는 [해당앱 폴더]/models.py에 작성합니다.
 
본격적으로 모델링을 하기 전, 우리가 어떤 서비스를 만들지 다시 한번 생각해 봅시다.
우리는 테스트지를 만들 것이고, 테스트지의 각 항목에 점수를 매겨 점수가 가장 높은 항목을 결과값으로 보여줄 것입니다.
질문지질문지
질문지
결과페이지결과페이지
결과페이지

2.1. Developer : 개발자 유형

개발자 유형은 결과값으로 보여 줄 모델입니다.
개발자 유형에는 두 가지 변수가 들어갑니다. name은 개발자 유형(프론트엔드, 백엔드 등)을 의미하며 count는 테스트 결과에 대한 카운트 값을 의미합니다. (count 값은 메인 페이지에서 보여지는 결과값이에요!)
class Developer(models.Model): name = models.CharField(max_length=50) count = models.IntegerField(default=0)

2.2. Question (문항)

문항은 테스트지의 질문 목록들을 의미합니다.
number는 문항 번호를 의미하며, content는 질문 내용을 뜻합니다.
문항 번호는 겹치면 안 되기 때문에 unique=True 옵션을 줍니다.
class Question(models.Model): number = models.IntegerField(unique=True) content = models.CharField(max_length=100)

2.3. Choice : 선택지

content는 해당 선택지의 내용을, question은 해당 선택지가 속한 문항을, developer 는 해당 선택지가 어느 개발 유형의 선택지인지를 나타냅니다.
questiondeveloper는 여러 개의 선택지를 가질 수 있지만, 각 선택지는 하나의 question과 하나의 developer만 가질 수 있습니다. 이러한 관계를 1:N 이라고 표현합니다. 그리고 이러한 경우 models.ForeignKey 필드를 사용합니다. (DB에서 외래키를 뜻합니다.)
선택지는 속해있는 문항이 없어지거나, 나타내는 개발자 유형이 삭제되면 같이 삭제되어야 된다는 의미로 on_delete=models.CASCADE 옵션을 줍니다.
그리고 선택지 중에서는 어느 개발 유형에도 속하지 않는 경우도 있기 때문에 developer에는 null 값이 저장될 수 있도록 null=True 옵션도 추가합니다.
class Choice(models.Model): content = models.CharField(max_length=100) question = models.ForeignKey(to='main.Question', on_delete=models.CASCADE) developer = models.ForeignKey(to='main.developer', on_delete=models.CASCADE, null=True)

3. 마이그레이션

마이그레이션(migration)이란 모델에서 추가되거나 수정된 내용들을 DB에 옮기는 작업을 의미합니다. Django에서는 SQL 없이 모델에 작성하면 DB에 저장된다고 했었죠? 이 과정을 수행해주는 명령어입니다.

3.1. makemigrations

일단 makemigrations 명령어를 통해 DB의 설계도를 작성합니다. 이 과정은 migration을 준비하는 과정이며, migrate를 하기 전 반드시 수행해주셔야 합니다!
$ python manage.py makemigrations
notion imagenotion image
사진처럼 나온다면 makemigration 명령이 정상적으로 수행된 것이고 main/migrations/ 경로에 001_initial.py 라는 설계도 파일이 만들어졌을 겁니다.
notion imagenotion image

3.2. migrate

이번에는 해당 설계도를 통해 DB에 테이블을 만드는 명령어 migrate를 사용합니다.
$ python manage.py migrate
notion imagenotion image
migrate가 성공하면 위 사진 처럼 나올 것입니다.
결과 메시지를 보면, 우리가 만든 main 앱 뿐만 아니라 다른 앱들 admin, auth 등이 보이는데 장고 프로젝트를 처음 생성하면 기본적으로 내장되는 앱들입니다.
처음 migrate 시에는 이러한 기본 앱들이 가지고 있는 모델들도 migrate 되는 것입니다.