Django 모델 필드

자기개발자·2022년 4월 18일
0

강의 내용 정리

강의명 : 파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

강의: 장고 모델 필드


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

Primary Key: AutoField (ID처럼 자동생성되어서 increment되는 field), BigAutoField

문자열: CharField, TextField, SlugField

날짜/시간: DateField, TimeField, DateTimeField,DurationField

참/거짓: BooleanField, NullBooleanField

숫자: IntegerField,SmallIntegerfield, PositiveIntegerField, PositiveSmallIntegerField, BigIntegerField, DecimalField, FloatField

파일: BinaryField, FileFiled, ImageField, FilePathField

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

이메일: EmailField

URL: URLField

UUID: UUIDField

아이피: GenericIPAddressField

Relationship Types

  • ForeignKey
  • ManyToManyField
  • OneToOneField

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

django-model-utils: https://django-model-utils.readthedocs.io/en/latest/

모델필드들은 db 필드타입을 반영

DB에서 지원하는 필드들을 반영

Varchar 필드타입 → CharField, SlugField, URLField, EmailField

파이썬 데이터타입과 데이터베이스 데이터타입을 매핑

AutoField → int

BinaryField → bytes

BooleanField → bool

CharField/SlugField/URLField/EmailField → str

CharField/SlugField/URLField/EmailField의 경우처럼 다 str인 경우더라도, 디폴트로 적용된 유효성 검사 등의 차이가 생긴다.

예를 들어서 CharField 같은 경우에는 지정한 길이로 str을 받기만 한다면, URLField는 str이면서 + URL 형식이어야지만 저장이 된다. 마찬가지로 EmailField도 이메일 형식이어야지만 저장이 된다.

같은 모델필드라 할지라도 DB에 따라서 다른 타입이 될 수 도 있다.

자주 쓰는 필드 공통 옵션

blank, null, db_index, default, unique, choices, validators, verbose_name, help_text

black 같은 경우에는 Default가 False이다.

그래서 message = models.TextField() 이런식으로 생성하고, message 값이 없이 저장한다면 모델과 연동된 django form 사용시 유효성 검사에서 실패한다. (Form을 사용하지 않고 Model만 사용해서 저장하면 유효성 검사가 수행되지 않음)

하지만 그렇다고 해서, 무조건적으로 blank랑 null 같은 옵션을 True 설정하지 말 것 (django의 이점을 활용하지 못함)

Model 예시# Django 모델 필드

강의 내용 정리

강의명 : 파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

강의: 장고 모델 필드


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

Primary Key: AutoField (ID처럼 자동생성되어서 increment되는 field), BigAutoField

문자열: CharField, TextField, SlugField

날짜/시간: DateField, TimeField, DateTimeField,DurationField

참/거짓: BooleanField, NullBooleanField

숫자: IntegerField,SmallIntegerfield, PositiveIntegerField, PositiveSmallIntegerField, BigIntegerField, DecimalField, FloatField

파일: BinaryField, FileFiled, ImageField, FilePathField

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

이메일: EmailField

URL: URLField

UUID: UUIDField

아이피: GenericIPAddressField

Relationship Types

  • ForeignKey
  • ManyToManyField
  • OneToOneField

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

django-model-utils: https://django-model-utils.readthedocs.io/en/latest/

모델필드들은 db 필드타입을 반영

DB에서 지원하는 필드들을 반영

Varchar 필드타입 → CharField, SlugField, URLField, EmailField

파이썬 데이터타입과 데이터베이스 데이터타입을 매핑

AutoField → int

BinaryField → bytes

BooleanField → bool

CharField/SlugField/URLField/EmailField → str

CharField/SlugField/URLField/EmailField의 경우처럼 다 str인 경우더라도, 디폴트로 적용된 유효성 검사 등의 차이가 생긴다.

예를 들어서 CharField 같은 경우에는 지정한 길이로 str을 받기만 한다면, URLField는 str이면서 + URL 형식이어야지만 저장이 된다. 마찬가지로 EmailField도 이메일 형식이어야지만 저장이 된다.

같은 모델필드라 할지라도 DB에 따라서 다른 타입이 될 수 도 있다.

자주 쓰는 필드 공통 옵션

blank, null, db_index, default, unique, choices, validators, verbose_name, help_text

black 같은 경우에는 Default가 False이다.

그래서 message = models.TextField() 이런식으로 생성하고, message 값이 없이 저장한다면 모델과 연동된 django form 사용시 유효성 검사에서 실패한다. (Form을 사용하지 않고 Model만 사용해서 저장하면 유효성 검사가 수행되지 않음)

하지만 그렇다고 해서, 무조건적으로 blank랑 null 같은 옵션을 True 설정하지 말 것 (django의 이점을 활용하지 못함)

Model 예시

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

  • blank null 지정 최소화
  • validators들이 다양하게 타이트하게 지정됨
  • 필요하다면 validators들을 추가로 타이트하게 지정
  • 프론트엔드에서의 유효성 검사는 사용자 편의를 위해서 수행하며, 백엔드에서의 유효성 검사는 필수
    • 클라이언트에서 넘어오는 값은 누가 만들수도 있고 해서 백프로 신뢰하면 안됨. 그래서 백앤드 유효성 검사 필수
  • 직접 유효성 로직을 만들지 말고 이미 잘 구성된 features들을 가져다 쓸 것. 장고의 Form/Model을 통해 지원되며, django-rest-framework의 Serializer를 통해서도 지원됨

ORm은 SQL 쿼리를 만들어주는 역할일 뿐 성능 높은 애플리케이션을 위해서는 사용하려는 DB에 대한 깊은 이해가 필요

profile
Self Refiner

0개의 댓글