장고 모델(ORM)과 장고 모델 필드

guava·2021년 11월 2일
3

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.

1. 장고 모델

장고 모델과 내장 ORM

장고 모델을 통해 데이터베이스 테이블과 파이썬 클래스를 1:1로 매핑한다.

  • 모델 클래스 명은 단수형으로 지정한다. (Posts가 아닌 Post)
  • 매핑되는 모델 클래스는 DB 테이블 필드 내역이 일치해야 한다.
  • 모델을 만들기 전에, 서비스에 맞게 데이터베이스 설계를 해야 한다. (틈틈히 관계형 데이터베이스 학습이 필요하다.)

모델 활용 순서

모델과 데이터베이스는 다음 두가지로 관리될 수 있다. 보통 첫번째를 많이 활용하나 이미 데이터베이스가 구축된 상태에서 적용할 경우 두번째 방법이 사용되기도 한다.

장고 모델을 통해 데이터베이스 형상을 관리할 경우

  1. 모델 클래스 작성
  2. 모델 클래스로부터 마이그레이션 파일을 생성 python manage.py makemigrations
  3. 마이그레이션 파일을 데이터베이스에 적용 python manage.py migrate
  4. 모델 활용

    마이그레이션을 하면 DB 테이블명은 "앱이름_모델명"으로 정해진다.
    모델 Meta 클래스의 db_table 속성을 지정하고 싶다면 마이그레이션 전에 지정해야 한다.

장고 외부에서 데이터베이스 형상을 관리할 경우

  1. 데이터베이스로부터 모델 클래스 소스 생성 python manage.py inspectdb
  2. 모델 활용

모델 적용 순서

모델 적용 순서는 다음과 같이 모델을 정의하고 마이그레이션 명령어를 사용한다.

  1. 모델 정의
    # shop/models.py
    from django.db import models

    class Item(models.Model):
        name = models.CharField(max_length=100)
        desc = models.TextField(blank=True)
        price = models.PositiveIntegerField()
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
  1. 마이그레이션 파일 생성
    python manage.py makemigrations 앱이름
  2. 마이그레이션 파일 적용
    python manage.py migrate
  3. 데이터베이스 확인 (DB 종류에 따라 상이함)

2. 장고 모델 필드

기본 지원되는 모델필드 타입

종류필드
기본키AutoField, BigAutoField
문자열CharField, TextField, SlugField
날짜/시간DateField, TimeField, DateTimeField, DurationField
참/거짓BooleanField, NullBooleanField
숫자IntegerField, SmallIntegerField, PositiveIntegerField, PositiveSmallIntegerField, BigIntegerField, DecimalField, FloatField
파일Binary, FileFiled, ImageField, FilePathField
이메일EmailField
URLURLField
UUIDUUIDField
아이피GenericIPAddressField
Relationship TypesForeignKey, ManyToManyField, OneToOneField

자주 쓰는 필드 공통 옵션

옵션설명DB옵션 여부
blank장고 단에서 validation시에 empty 허용 여부 (디폴트 False)
nullnull 허용 여부True
db_index인덱스 필드 여부. 마이그레이션시에만 적용된다.True
default디폴트 값 지정. 혹은 리턴해줄 함수 지정
unique현재 테이블 내에서 유일성 여부True
choicesselect박스 소스로 사용
validatorsvalidators를 수행할 함수를 다수 지정
verbose_name필드 레이블, 미지정 시 필드명이 사용
help_text필드 입력 도움말

설계한 데이터베이스 구조에 따라 최대한 필드타입을 타이트하게 하자

  1. blank/null 지정은 최소화 한다.
  2. validators들이 다양하게 혹은 타이트하게 저징한다.
  3. 프론트엔드에서의 유효성 검사는 사용자 편의를 위한 것이다. 백엔드의 유효성 검사는 별도로 수행해야 한다.
  4. 직접 유효성 로직을 만들지 말고 이미 구성된 Features를 가져다 쓰자. Form/Model 또는 DRF의 Serializer를 통해서도 지원된다.

ORM은 SQL 쿼리를 만들어주는 역할일 뿐이다.
성능 높은 애플리케이션을 위해서는 사용할 데이터베이스에 대한 깊은 이해가 필요하다.

1개의 댓글

comment-user-thumbnail
2022년 8월 13일

읽기 좋은 글이네요! 시리즈 정주행하겠습니다. 감사해서 댓글 남길려고 velog 가입했어요 ㅎ

답글 달기