Django의 데이터 모델

Jun·2021년 5월 2일
0

Django

목록 보기
3/4

Django 기반 프로젝트에서는 데이터 베이스 모델링을 어떻게 할 수 있을까?^1

데이터 모델이란?

데이터 모델이란 데이터의 관계 및 접근과 흐름에 필요한 처리 과정에 대한 추상화된 모형이다.^2 데이터에 대한 추상화된 모델은 데이터의 구조를 결정한다.

Django의 ORM

Django는 데이터베이스의 테이블과 테이블에 관련된 메서드를 파이썬의 클래스와 메서드로 추상화하는 ORM (Object Relational Mapping) 사용한다.

models.py에 해당 앱에서 사용하는 데이터의 모델들을 정의하며 각 모델은 django.db.models.Model 클래스의 서브 클래스로 정의되어있다. 정의된 각 모델이 데이터베이스의 하나의 테이블을 표상한다고 생각하면 된다. Django는 정의된 모델과 모델들간의 관계를 바탕으로 설정된 DB와 상호작용 할 수 있는 API를 제공한다.

Django의 모델에는 테이블을 구성하는 컬럼들과 컬럼의 필드 타입을 정의할 수 있다. 뿐만 아니라 Model 또한 파이썬 클래스이기 때문에 테이블과 관련된 변수나 서브 메서드들을 정의할 수 있다. Django는 이렇게 테이블의 데이터 구조와 관련된 행위를 클래스 정의 안에서 한 번에 정의할 수 있다는 장점이 있다.

Django의 Model 정의

class [모델 이름](models.Model):
	[속성1] = models.[필드 타입]([필드 옵션1],[필드 옵션2],[필드 옵션3],...)
	...
	def Meta:
		[내부 클래스 속성] = ...

	def [모델 메서드1]:
		...

모델 속성 (Field)

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 을 생성합니다.)

필드 타입
필드 옵션

각 필드마다 별개로 추가 가능한 필드 옵션이나 (예: CharFieldmax_length) ^4 모든 필드 타입에 적용 가능한 공통 옵션도 있다. ^5

자주 쓰이는 공통 옵션은 다음과 같다.

  • null: True면 Django가 빈 값을 NULL로 DB에 저장한다. 디폴트는 False
  • blank: True면 해당 속성의 값이 비어있는 것을 허용한다. null 옵션과는 쓰임이 다르다. null은 순전히 데이터베이스와 관련있는 옵션인 반면 blank는 form validation에서 비어있는 값을 허용할때 쓰인다. 즉 blank=False로 설정하면 해당 form의 값은 반드시 작성해야 하는 것.
  • choices: 이항 튜플의 리스트로 이뤄진 필드이다. 이게 주어지면 디폴트로 텍스트 박스 대신 선택 박스가 생겨서 입력 값을 선택 옵션으로만 제한한다. (선택지의 순서만 바뀌어도 새로운 마이그레이션 필요함) 튜플의 첫 값이 데이터베이스에 저장되고 두 번째 값은 form 위젯에 표시되는 값이다.
  • default: 해당 필드에 대한 디폴트 값을 의미한다. 값이 들어가도 되고 callable한 객체가 들어가도 된다. Callable한 객체가 들어갈 시 객체가 생성되는 매 순간 해당 객체가 Call 된다.
  • help_text: Doc이나 Form 위젯에서 표시되는 도움말이다.
  • primary_key: True면 해당 필드가 그 모델의 Primary Key가 된다. 만약에 모델의 어떤 필드에도 이 옵션이 존재하지 않는다면 Django는 자동으로 IntegerField를 하나 만들어서 해당 필드를 Primary Key로 쓴다.^6 Primary Key로 설정된 필드는 읽기 전용이다. 해당 필드를 변경해서 저장하면 새로운 객체가 만들어져서 저장된다.
  • unique: True면 해당 필드는 전체 테이블에서 유일한 값을 가져야 한다. 중복된 값을 (이미 테이블에 존재하는) save 하고자 하면 에러가 발생한다.
상세 필드 이름 (Verbose field names)
  • ForeignKey, ManyToManyField, OneToOneField를 제외하고는 모든 필드는 첫 번째 위치 인자로 verbose_name 을 받는다. 주어지지 않는다면 자동으로 해당 속성의 이름을 변환해서 사용한다.
  • ForeignKey, ManyToManyField, OneToOneField에서는 첫 번째 인자로 연결되는 다른 모델 클래스가 들어가므로 verbose_name은 키워드 인자로 넣어주면 된다.
커스텀 필드 정의
  • Django의 모든 Field 타입은 Field 추상 클래스에서 상속된 클래스이다.
  • 개발자가 이 Field 추상 클래스나 또는 기존 Field 클래스를 상속받아 새로운 로직을 정의해서 커스텀 필드를 만들 수 있다.^3

모델 메서드

DB 테이블 자체에는 메서드가 없지만 Django의 모델 클래스에는 메서드를 정의할 수 있다.
파이썬 메서드는 클래스 메서드와 객체 메서드로 구분할 수 있는데, 클래스 메서드는 DB 테이블 전체 레벨에서 동작하는 것이고 객체 메서드는 테이블의 개별 레코드 기준에서 동작하는 메서드이다.
Django 모델에서는 클래스 메서드를 사용하지 않고 객체 메서드만 사용한다. 즉 모델 메서드는 DB 테이블의 각 레코드에만 영향을 끼친다.
Django 모델의 테이블 단위에 영향을 끼치고 싶다면 클래스 메서드 대신 Django의 Manager 클래스를 정의해서 해당 Manager 클래스의 메서드를 통해 테이블에 대한 조작을 수행한다.

profile
개발합니다.

0개의 댓글