(Django) 자주 쓰는 model 필드 유의사항

duo2208·2021년 8월 26일
0

Django

목록 보기
2/23
post-thumbnail

언제 null을 쓰고 언제 blank를 쓰는가


1. null (database-related)
DB와 관련되어 있다. 주어진 데이터베이스 컬럼이 null 값을 가질 것인지 아닌지를 정의한다. default 값은 False 이다.
- True : Django will store empty values as NULL in the database.
- False :

2. blank (validation-related)
유효성과 관련되어 있다. form_is_vaild() 가 호출될 때 폼 유효성 검사에 이용된다. default 값은 False 이다.
- True : form validation will allow entry of an empty value.
- False : the field will be required.

class Person(models.Model):
    name1 = models.CharField(max_length=255) # 폼에서 빈값으로 제출하면 허용하지 않는다.
    name2 = models.CharField(max_length=255, blank=True)  # 폼에서 빈값으로 제출하면 DB에 빈 문자열로 저장된다.
    name3 = models.CharField(max_length=255, null=True, blank=True) # 폼에서 빈값으로 제출하면 DB에 null로 저장된다.
🚀 (Django) Model filed reference

두 설정은 모두 필드를 비워두는 것을 허용할 것인지에 대한 설정이다. 테이블을 생성하다보면 두 설정들을 언제 쓰는 것이 적절한지 혼동될 때가 많다. 이에 대한 가이드를 제시한다.

필드 타입null=True로 설정하기blank=True로 설정하기
CharField, TextField 등의 문자열 기반 필드이용하지 않는다. 장고 표준은 빈 값(empty_value)을 빈 문자열(empty_string)로 저장하는 것이다. 빈 값(empty_value)에 대해서 두 가지 값을 중복하여 가지게 될 위험이 있으므로, Null 이 아닌 빈 문자열(empty_string)로 표현하는 것을 권장한다.이용한다. 위젯이 빈 값(empty_value)을 허용하기를 원한다면 설정한다. 이렇게 설정하면 데이터베이스에 빈 값이 빈 문자열로 저장된다.
FileField, ImageField이용하지 않는다. 장고는 MEDIA_ROOT의 경로를 CharField에 파일 또는 이미지로 저장한다. 따라서 같은 패턴이 FileField에도 적용된다.이용한다. CharField에 적용된 것과 같은 규칙이 적용 된다.
BooleanField이용하지 않는다. 대신 NullBooleanField를 이용한다.이용하지 않는다.

(TIP) 필드타입을 최대한 타이트하게 지정해주자

blank/null을 적절하게 쓰는 것도 문제지만, 쓰는 빈도도 최소화하여 쓰도록 하자. ORM은 결국 SQL 쿼리를 만들어주는 역할일 뿐, 우리는 데이터베이스 정규화(normalization)에 익숙해져야 한다. blank/null 을 여기저기 쓰기보다는 validatiors 추가하여 타이트하게 만들어주자.


언제 BinaryField를 이용하는가


BinaryField 로부터 파일을 직접 서비스하는 것은 자제하자. 바이너리 데이터는 그 크기가 방대할 수도 있고 그로 인해 데이터베이스가 느려질 수 있다. 실제로 그런 경우가 발생해서 바디너리 데이터 저장이 병목 지점이 된다면, 해당 데이터를 파일 형태로 저장하고 FileField에 레퍼런스만 저장하는 방법으로 해결할 수 있다.

+ 데이터베이스를 파일 저장소로 이용하는 것에 대한 문제점

  • 데이터베이스의 '읽기/쓰기' 속도는 항상 파일 시스템의 '읽기/쓰기' 속도보다 느리다.
  • 데이터베이스 백업에 드는 공간과 시간이 점점 증가하게 된다.
  • 파일 자체에 접근하는 데 앱(장고) 레이어와 데이터베이스 레이어 둘 다를 거쳐야만 한다.
🚀 Three things you should never put in your database


📌 참고 출처

0개의 댓글