Django 기반 프로젝트에서는 데이터 베이스 모델링을 어떻게 할 수 있을까?^1
데이터 모델이란 데이터의 관계 및 접근과 흐름에 필요한 처리 과정에 대한 추상화된 모형이다.^2 데이터에 대한 추상화된 모델은 데이터의 구조를 결정한다.
Django는 데이터베이스의 테이블과 테이블에 관련된 메서드를 파이썬의 클래스와 메서드로 추상화하는 ORM (Object Relational Mapping) 사용한다.
models.py
에 해당 앱에서 사용하는 데이터의 모델들을 정의하며 각 모델은 django.db.models.Model
클래스의 서브 클래스로 정의되어있다. 정의된 각 모델이 데이터베이스의 하나의 테이블을 표상한다고 생각하면 된다. Django는 정의된 모델과 모델들간의 관계를 바탕으로 설정된 DB와 상호작용 할 수 있는 API를 제공한다.
Django의 모델에는 테이블을 구성하는 컬럼들과 컬럼의 필드 타입을 정의할 수 있다. 뿐만 아니라 Model 또한 파이썬 클래스이기 때문에 테이블과 관련된 변수나 서브 메서드들을 정의할 수 있다. Django는 이렇게 테이블의 데이터 구조와 관련된 행위를 클래스 정의 안에서 한 번에 정의할 수 있다는 장점이 있다.
class [모델 이름](models.Model):
[속성1] = models.[필드 타입]([필드 옵션1],[필드 옵션2],[필드 옵션3],...)
...
def Meta:
[내부 클래스 속성] = ...
def [모델 메서드1]:
...
ORM 기법의 특징에 따라 테이블의 컬럼은 Django의 모델 클래스의 속성으로 정의한다.
모델의 데이터 필드 정의는 모델 정의에서 가장 중요하고 필수적인 부분이다. 각 속성의 필드명, 필드 타입, 필드 옵션의 정의를 통해 클래스의 필드 정의가 가능하다.
모델에 데이터 필드를 정의해서 해당 테이블의 컬럼 이름과 데이터 타입을 정의할 수 있다.
필드 정의 시 유의사항
1. 필드 명에 파이썬 예약 키워드는 사용 불가하다. (e.g.pass
라는 필드 명 사용 불가)
2. 필드 명 안에dunder(__)
사용 불가.
3. SQL 예약어 (join, where, select 등)은 필드명으로 사용 가능.
4. ForeignKey, ManyToManyField 그리고 OneToOneField 들을 제외한, 각 필드 타입은 선택적으로 첫번째 위치인자로 verbose name 을 받는다. (verbose name 이 주어지지 않았을때는, Django 는 자동으로 field 의 속성명의 언더스코어를 공백으로 전환하여 verbose name 을 생성합니다.)
각 필드마다 별개로 추가 가능한 필드 옵션이나 (예: CharField
의 max_length
) ^4 모든 필드 타입에 적용 가능한 공통 옵션도 있다. ^5
자주 쓰이는 공통 옵션은 다음과 같다.
IntegerField
를 하나 만들어서 해당 필드를 Primary Key로 쓴다.^6 Primary Key로 설정된 필드는 읽기 전용이다. 해당 필드를 변경해서 저장하면 새로운 객체가 만들어져서 저장된다.verbose_name
을 받는다. 주어지지 않는다면 자동으로 해당 속성의 이름을 변환해서 사용한다. DB 테이블 자체에는 메서드가 없지만 Django의 모델 클래스에는 메서드를 정의할 수 있다.
파이썬 메서드는 클래스 메서드와 객체 메서드로 구분할 수 있는데, 클래스 메서드는 DB 테이블 전체 레벨에서 동작하는 것이고 객체 메서드는 테이블의 개별 레코드 기준에서 동작하는 메서드이다.
Django 모델에서는 클래스 메서드를 사용하지 않고 객체 메서드만 사용한다. 즉 모델 메서드는 DB 테이블의 각 레코드에만 영향을 끼친다.
Django 모델의 테이블 단위에 영향을 끼치고 싶다면 클래스 메서드 대신 Django의 Manager 클래스를 정의해서 해당 Manager 클래스의 메서드를 통해 테이블에 대한 조작을 수행한다.