프로그래밍/Python
[Django] 모델의 clean()이 자동으로 호출되지 않는 이유
vince joe
2021. 2. 12. 21:13
좀 오래된 글이긴 한데 지금도 동일합니다.
장고에서는 모델 단위 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은 자동으로 호출됩니다.
반응형