당신은 멋쟁이, 우리는 장고쟁이~

0%

Writing your first Django app, part2 - 2편

모델 작성하기


지난 포스팅에서 데이터베이스 설정을 마쳤습니다. 튜토리얼에서 진행하는 기본 데이터베이스인 SQLite 를 사용하고, 기본앱들에 대한 migrate 를 완료해서, 필요한 데이터베이스 테이블들을 생성해 주었습니다.


이번 파트는, 모델을 작성해 봅니다. 데이터베이스 레이아웃과 추가적인 메타데이터를 정의 합니다.


모델은 하나의 데이터에 대한 확실한 사실적 정의를 내립니다.

모델은 필요한 저장할 데이터의 필드들과 동작들의 정보를 가지고 있습니다.

Django 는 DRY 원칙을 따릅니다 (Don’t Repeat Yourself)


목표하는것은 데이터 모델을 한곳에 정의하고, 그곳에서 자동으로 도출해 내는겁니다.


Ruby on Rails 와는 다르게, 여기서는 migrations 를 포함합니다.

예를들면, migrations 는 전적으로 모델파일에서 추출되고,


Django 는 본질적으로 데이터베이스 스키마를 현재 모델에 업데이트 할수 있게 내역을 기록합니다.



모델 클래스 작성하기



투표앱 튜토리얼에서는, 2개의 모델을 작성합니다.



  • Question - 질문과 발행날짜 정보를 가지고 있는 투표 질문
  • Choice - 질문에 대한 선택문들과 투표집계 정보를 가지고 있습니다


각각의 Choice 들은 하나의 Question과 연관되어 있습니다.


해당 컨셉은 파이썬 클래스들로 표현됩니다.

polls/models.py 파일을 열고, 아래와 같이 작성해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
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)

여기서, 각가의 모델들은 django.db.models.Model을 상속받는 서브클래스들로 표현됩니다.


각 모델은 몇개의 클래스 변수들을 가지고 있는데,


각 클래스 변수들은 모델안의 데이터베이스 필드들을 표현합니다



필드 정보



각 필드들은 필드클래스의 인스턴스들로 표현됩니다.


예) 케릭터필드를 위한 CharField, 날짜시간필드를 위한 DateTimeField


이 필드 정보들은 각 필드들이 가지는 데이터 타입이 어떤것인지 Django 에게 말해줍니다.


각 필드 인스턴스들의 이름들 (예, question_text 혹은 pub_date)은 필드들의 기계친화적 이름들입니다.


이 필드 이름들을 파이썬 코드에서 사용할수 있고, 데이터베이스에서 컬럼명으로 사용됩니다. 사람이 읽기 편한 형태의 이름으로 필드를 만들기 위해서 선택적으로 첫번째 위치인자를 필드명으로 사용할수 있습니다.


보통 Django의 내부 설명 용도로 쓰이는, 문서를 2배로 늘려버립니다. 만약, 필드가 제공되지 않으면, Django는 기계친화적인 이름을 우선 사용합니다.


튜토리얼에서는, Question.pub_date 만 인간이 읽기 좋은 형태의 이름을 정의합니다. 그외에 다른 필드들은, 기계친화적 이름이라도 사람이 읽기 충분합니다.



Field 클래스들의 필수 인수



어떤 필드 클래스들은 필수적으로 인수를 가져야 합니다.


예를들어, CharField 는 최대 길이값인 max_length 인수를 가져야 하고, 데이터베이스 스키마에 사용될 뿐만 아니라 검증에도 사용됩니다.



필드는 여러가지 선택적 인수들을 가질수도 있습니다. 튜토리얼에서는 votes 의 기본값을 0으로 세팅해주었습니다.



데이터베이스 관계의 정의



마지막으로, 튜토리얼의 데이터베이스 모델에서는 관계가 정의 되어 있습니다.


ForeignKey를 사용해서 Question 과 Choice 의 관계가 정의되어 있습니다. Django 는 모든 공통적인 데이터베이스 관계들을 지원합니다. 예) many-to-one, many-to-many, one-to-one


튜토리얼에 나온 Question 과 Choice 는,

일 대 다수의 관계인

one-to-many (many-to-one) 의 관계를 가지고 있습니다.



하나의 질문에, 여러가지 선택지가 있다는 얘기 입니다.


2020년 4월 현재에 진행되고 있는, 제 21대 국회의원 선거를 예로 들면.

‘우리 지역에서 누가 국회의원이 되어야 하나?’ 라는 질문에, 여러 후보들이 존재합니다.

하나의 질문에 여러가지 선택이 있는겁니다.

마치며..


아주 간단한 모델을 작성해 보았습니다.


다음 포스팅에는 모델의 활성화를 진행해 볼겁니다.