본문 바로가기

레퍼런스/장고 튜토리얼

장고(Django) 모델 만들기.

이제 저만의 모델을 선언할 거에요. - 추가적인 메타데이터가 있는 데이터베이스 레이아웃이 필수적입니다.

 

철학


모델은 데이터에 대한 단일, 선언적인 소스입니다. 제가 데이터를 저장하는 동작과 필수적인 필드를 포함합니다. 장고는 DRY 원칙(Don't Repeat Yourself)을 따릅니다. 모델의 목표는 데이터 모델을 한 곳에서 정의하고 정의한 곳으로부터 데이터 모델을 파생시키는 것입니다.

migrations도 그 중 하나입니다 - Ruby On Rails와 다르게 migrations는 제 모델 파일에서 파생됩니다. 본질적으로 장고가 현재 모델과 일치하도록 데이터베이스 스키마를 업데이트하기 위해 찾아갈 수 있는 기록입니다.

 

아까 만들었던 간단한 투표 앱에서,

 

2019/10/11 - [노력/웹 개발] - 장고(Django) 투표 앱 만들기.

 

장고(Django) 투표 앱 만들기.

이제 "프로젝트" 환경이 셋업됐습니다. 이제 제 작업을 할 준비가 된 것입니다. 장고에 쓰이는 각 어플리케이션은 특정 협약을 따르는 python 패키지로 이루어져 있습니다. 장고에는 앱의 기본 디렉토리 구조를 자..

ddomyangggung.tistory.com

 

두 개의 모델을 만들게요 : 질문선택입니다. 질문은 질문 내용과 발행 날짜를 포함합니다. 선택은 두 개의 필드를 포함합니다 : 선택할 텍스트와 투표 집계입니다. 각 선택질문과 연관이 있습니다.

 

이 개념은 간단한 파이썬 클래스로 확인할 수 있습니다. polls/models.py 파일을 아래와 같이 변경해주세요 :

 

# polls/models.py

from django.db import models

# Create your models here.
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의 서브클래스로 하나씩의 클래스로 표기됩니다. 각 모델은 데이터베이스 필드를 대표하는 여러 클래스 변수를 가집니다.

 

각 필드는 Field 클래스의 인스턴스를 나타냅니다 - 예를 들어, 캐릭터 필드를 나타내는 CharField 그리고 datetimes를 나타내는 DateTimeField가 있습니다. 이 동작이 장고가 어떤 타입의 데이터를 가지고 있는지 나타내줍니다.

 

Field 인스턴스의 이름이 (예를 들면, 위의 코드에서 question_textpub_date) 기계 친화적인 형식인 필드의 이름입니다. 저는 이 값을 제 파이썬 코드와 데이터베이스에는 컬럼의 이름으로 사용하게 될 것입니다.

 

Field의 첫번째 포지셔널 인자에는 사람이 읽기 쉬운 이름으로 사용하게 선택할 수 있습니다. 이 필드가 제공되지 않으면 장고는 기계 친화적인 이름을 사용합니다. 위 예에서는 사람이 읽기 쉬운 이름으로만 작성된 것은 Question.pub_date 뿐입니다.  이 모델에서의 다른 필드들은 기계 친화적인 이름이지만 사람이 읽는 이름과 크게 다르지 않고 가독성이 있는 편입니다.

 

몇몇 Field 클래스는 인자를 필요로 합니다. 예를 들면, CharFieldmax_length를 필요로 합니다. 이는 데이터베이스 스키마 뿐만 아니라 유효성 검사에도 사용됩니다.

 

Field는 여러 가지 선택적 인자를 가집니다. 이 경우에는 default 투표(votes) 값을 0으로 설정했습니다.

 

마지막으로, ForeignKey를 사용하여 관계가 정의됩니다. 이 경우에는 장고에게 각 Choice가 하나의 Question에 연관돼 있는 것을 말해줍니다. 장고는 일반적으로 데이터베이스 관계가 나타낼 수 있는 모든 관계를 지원합니다.