Django에서 Model은 데이터 서비스를 제공하는 Layer이다. Django의 Model은 각 Django App안에 기본적으로 생성되는 models.py 모듈 안에 정의하게 된다. models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이타베이스에서 하나의 테이블에 해당된다.
Django 모델에 대해 알아보기 위해 아래 그림처럼 feedback 이라는 새 Django App을 생성하였다. 이어 feedback App 폴더 안에 있는 models.py 파일에 새로운 모델 클래스(Feedback)을 추가하였다.
위의 그림을 보면 핵심은 아래와 같다
그럼 좀 자세히 설명해보겠다.
Django 모델은 "django.db.models.Model" 의 파생 클래스이며, 모델의 필드는 클래스의 Attribute로 표현되며 테이블의 컬럼에 해당한다. 위의 예를 보면 Feedback이라는 클래스가 modesl.Model의 파생클래스이며, 그 클래스 안에 4개의 클래스 변수 (혹은 Class Attribute)가 있음을 볼 수 있다. (만약 Primary Key가 지정되지 않으면, 모델에 Primary Key 역활을 하는 id 필드가 자동으로 추가되며 DB 테이블 생성시 자동으로 id 컬럼이 생성된다)
모델 클래스는 필드를 정의하기 위해 인스턴스 변수가 아닌 클래스 변수를 사용하는데, 이는 그 변수가 테이블 컬럼의 내용을 갖는 것이 아니라, 테이블의 컬럼 메타 데이타를 정의하는 것이기 때문이다. 필드를 정의하는 각각의 클래스 변수는 models.CharField(), models,IntegerField(), models.DateTimeField(), models.TextField() 등의 각 필드 타입에 맞는 Field 클래스 객체를 생성하여 할당한다. Field 클래스는 여러 종류가 있는데, 생성자 호출시 필요한 옵션들을 지정할 수 있다. 각 Field 클래스마다 반드시 지정해야 주어야 하는 옵션이 있을 수 있는데, 예를 들어 CharField (와 그 서브클래스들)은 필드의 최대 길이를 나타내는 max_length를 항상 지정해 주어야 한다.
모델의 필드에는 다양한 타입들이 존재한다.
먼저 Django 필드 타입(Django 공식 문서)을 확인하는걸 추천한다.
모든 필드 타입 클래스들은 추상클래스인 "Field"클래스의 파생클래스들이다. 아래는 주요 필드 타입에 대한 간단한 요약이다.
위와 같은 필드 타입 클래스 이외에, Django 프레임워크는 테이블 간 혹은 필드 간 관계(Relationship)을 표현하기 위해 ForeignKey, ManyToManyField, OneToOneField 클래스를 또한 제공하고 있다. 특히 ForeignKey는 모델 클래스간 (혹은 Underlying 테이블 간) Many-To-One (혹은 One-To-Many) 관계를 표현하기 위해 흔히 사용된다.
모델의 필드는 필드 타입에 따라 여러 옵션(혹은 Argument)를 가질 수 있다. 예를 들어, CharField는 문자열 최대 길이를 의미하는 max_length 라는 옵션을 갖는다. 필드 옵션은 일반적으로 생성자에서 argument로 지정한다. 다음은 모든 필드 타입에 옵션들 중 자주 사용되는 몇가지를 요약한 것이다.
추가로~! (매우중요)
나와 같이 이해를 못하는 사람들을 위한 사이트 추천
1. Django 모델, 필드 타입 및 옵션
2. ORM + QuerySet 개념 및 method
3. 데이터베이스 조회 요청방법
4. ERD 모델링 ~ 그리기 예제까지
5. westarbucks 예제
6. DB에서의 관계
7. model field reference(공식사이트)
8. field 타입 차이