좀 오래된 글이긴 한데 지금도 동일합니다.
장고에서는 모델 단위 validation을 정의할 때 Model 클래스의 clean 메소드를 오버라이드 합니다. 다른 validation 메소드로는 clean_fields, validate_unique가 있고, full_clean을 호출하면 clean, clean_fields, validate_unique 메소드를 모두 다 호출하게 됩니다.
문제는 모델의 save 메소드를 호출할 때 clean 메소드를 자동으로 호출해서 validation 체크를 하지는 않는다는 겁니다. 왜 그럴까요? 자동으로 validation을 해주면 편하지 않을까요?
이유는 아래와 같습니다
- 1. Backward Compatibility
- 뭐.. 이건 잘 모르겠습니다. Major version 올라갔으니까 별 상관 없지 않나요?
- 2. clean 메소드를 만들었다고 모델의 무결성이 보장된다는 거짓된 인상을 남길 수 있다
- save 메소드를 오버라이드 해서 super().save 호출 전 full_clean을 호출하도록 설정했다고 해봅시다
- 문제는 몇몇 메소드(ex. bulk_create, update, ...)는 save 메소드를 호출하지 않기 때문에 validation이 불가능합니다!
그래서 DB 레벨의 검증이 필요하다면 clean으로는 충분하지 않고, constraint를 추가해줘야 합니다
참고로 ModelForm을 사용하면 해당 모델의 clean은 자동으로 호출됩니다.
반응형
'프로그래밍 > Python' 카테고리의 다른 글
[Django] 모델 필드 길이로 필터링하는 법 (0) | 2021.03.02 |
---|---|
[Django] Proxy model도 마이그레이션이 필요하다 (0) | 2021.02.20 |
[Django] queryset을 합치면서 순서도 보존하는 방법 (2) | 2021.01.23 |
[Django] BinaryField로부터 파일을 직접 서비스하면 안되는 이유 (0) | 2021.01.16 |
[Python] dict를 복사하면서 특정 필드를 빼고 복사하는 법 (0) | 2021.01.13 |