devgraphy / airsm-django-restapi

AIRSM 프로젝트의 REST API 기반 Back-end
0 stars 0 forks source link

I set null=True attribute in a field. but admin says 'field is required.' #7

Open devgraphy opened 3 years ago

devgraphy commented 3 years ago

이름에서 알 수 있는 것 처럼 이 두가지는 거의 비슷한 역할을 하지만 차이점도 있다.

Null : DB와 관련되어 있다. (database-related) 주어진 데이터베이스 컬럼이 null 값을 가질 것인지 아닌지를 정의한다. Blank : 유효성과 관련되어 있다. (validation-related) form.is_valid()가 호출될 때 폼 유효성 검사에 사용된다. 그러므로 즉, null=True, blank=False 옵션을 가진 필드를 정의하는 것에는 문제가 없다. 이는 DB레벨에서는 해당 필드가 NULL 될 수 있지만, application 레벨에서는 required 필드인 것을 의미한다.

자, 개발자들이 가장 실수하는 부분은 CharField, TextField와 같은 문자열 기반 필드에 null=True를 정의하는 것이다. 이 같은 실수를 피해야한다. 그렇지 않으면 “데이터 없음”에 대해 두 가지 값, 즉 None 과 빈 문자열 을 갖게된다. “데이터 없음”에 대해 두 가지 값을 갖는 것은 중복이다. 그리고 Null이 아닌 빈 문자열을 사용하는 것이 장고 컨벤션이다.

따라서 만약 문자열 기반 모델 필드를 “nullable” 하게 만들고 싶다면 다음과 같이 하자.

class Person(models.Model):
  name = models.CharField(max_length=255)  # 필수
  bio = models.TextField(max_length=500, blank=True)  # 선택 (null=True를 넣지 말자)
  birth_date = models.DateField(null=True, blank=True)  # 선택 (여기서는 null=True를 넣을 수 있다.)

https://wayhome25.github.io/django/2017/09/23/django-blank-null/