Django의 Model

최동혁·2022년 12월 6일
0

Django

목록 보기
3/11

Django의 Model

장고의 강점은 Model과 Form

물론, 장고에서도 다양한 ORM, 라이브러리 사용 가능.

강력한 Model/Form

물론, 적절하게 섞어쓸 수도 있다.

SQL을 직접 실행할 수도 있지만, 가능하면 ORM을 쓰자.

→ 직접 SQL 문자열을 조합하지 말고, 인자로 처리.

Django Model

장고 내장 ORM

<데이터베이스 테이블>과 <파이썬 클래스>를 1:1로 매핑

모델 클래스명은 단수형으로 지정 - 예 : Posts (X), Post (O)

클래스이기에 필히 “첫 글자가 대문자인 PascalCase 네이밍”

매핑되는 모델 클래스는 DB 테이블 필드 내역이 일치해야 한다.

모델을 만들기 전에, 서비스에 맞게 데이터베이스 설계가 필수.

이는 데이터베이스의 영역. → 관계형 데이터베이스 학습도 필요.

from django.db import models

class Post(models.Model):
	title = models.CharField(max_lengh = 100)
	content = models.TextField()
	created_at = models.DateTimeField(auto_now_add = True)
	updated_at = models.DateTimeField(auto_now = True)

모델 활용 순서 (개발 순서)

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

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

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

데이터베이스로부터 모델 클래스 소스 생성 → inspectdb 명령

모델 활용

모델명과 DB 테이블명, 적용

DB 테이블명 : 디폴트 “앱이름_모델명”

blog앱

Post 모델 → “blog_post”

Comment 모델 → “blog_comment”

show 앱

Item 모델 → “shop_item”

Review 모델 → “shop_review”

커스텀 지정

모델 Meta 클래스의 db_table 속성

새로운 모델 만들기

# shop/models.py
from django.db import models

class Item(models.Model):
	name = models.CharField(max_lenght = 100)
	desc = models.TextField(blank = True)
	price = models.PositiveIntegerField()
	created_at = models.DateTimeField(auto_now_add = True)
	updated_at = models.DateTimeField(auto_now = True)

적용 순서

Item 모델 정의

마이그레이션 파일 생성

python manage.py makemigrations 앱이름

마이그레이션 파일 적용

python manage.py migrate

데이터베이스 확인

DB 종류에 따라 다양한 방법

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

Primary Key : AutoField, BigAutoField

문자열 : CharField, TextField, SlugField
날짜/시간 : DateField, TimeField, DateTimeField, DurationField
참/거짓 : BooleanField, NullBooleanField
숫자 : IntegerField, SmallIntegerField, PositiveIntegerField,
PositiveSmallIntegerfield, BigIntegerField, DecimalField, FloatField
파일 : BinaryField, FileField, ImageField, FilePathField

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

이메일 : EmailField

URL : URLField
UUID : UUIDField
아이피 : GenericIPAddressField
Relationship Types

  • ForeignKey
  • ManyToManyField
  • OneToOneField

그리고, 다양한 커스텀 필드들

자주 쓰는 필드 공통 옵션

blank : 장고 단에서 validation시에 empty 허용 여부 (디폴트: False)

null (DB 옵션) : null 허용 여부 (디폴트: False)

db_index (DB 옵션) : 인덱스 필드 여부 (디폴트: False)

default : 디폴트 값 지정, 혹은 값을 리턴해줄 함수 지정

  • 사용자에게 디폴트값을 제공코자 할 때

unique (DB 옵션) : 현재 테이블 내에서 유일성 여부 (디폴트: False)

choices : select 박스 소스로 사용

validators : validators를 수행할 함수를 다수 지정

  • 모델 필드에 따라 고유한 validators들이 등록 (ex- 이메일만 받기)

verbose_name : 필드 레이블, 미지정시 필드명이 사용

help_text : 필드 입력 도움말

예시

from django.conf import settings
from django.db import models

class Profile(models.Model):
	user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
	blog_url = models.URLField(blank=True)

class Post(models.Model):
	author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
	title = models.CharField(max_length=100, db_index=True)
	slug = models.SlugField(allow_unicode=True, db_index=True) # ModelAdmin.prepopulated_fields 편리
	desc = models.TextField(blank=True)
	image = models.ImageField(blank=True) # Pillow 설치가 필요
	comment_count = models.PositiveIntegerField(default=0)
	tag_set = models.ManyToManyField('Tag', blank=True)
	is_publish = models.BooleanField(default=False)
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)

class Comment(models.Model):
	author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
	post = models.ForeignKey(Post, on_delete=models.CASCADE)
	message = models.TextField()
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)

class Tag(models.Model):
	name = models.CharField(max_length=50, unique=True)

강력히 권함

설계한 데이터베이스 구조에 따라, 최대한 필드타입을 타이트하게 지정해주는 것이,
입력값 오류를 막을 수 있음.

  • blank/null 지정은 최소화 → manage.py inspect 명령을 통해 생성된 모델 코드는 초안이다.
  • validators 들이 다양하게/타이트하게 지정된다.
  • 필요하다면, validators들을 추가로 타이트하게 지정.
  • 프론트엔드에서의 유효성 검사는 사용자 편의를 위해서 수행하며, 백엔드에서의 유효성 검사는 필수.
  • 직접 유효성 로직을 만들지 마라. 이미 잘 구성된 Features들을 가져다 쓰자.
  • 장고의 Form/Model을 통해 지원되며, django-rest-framework의 Serializer를 통해서도 지원된다.
  • ORM은 SQL 쿼리를 만들어주는 역할일 뿐, 보다 성능높은 애플리케이션을
    위해서는, 사용하려는 데이터베이스에 대한 깊은 이해가 필요.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글