(참고: stackoverflow.com/questions/22587019/how-to-use-full-clean-for-data-validation-before-saving-in-django-1-5-graceful)

좀 오래된 글이긴 한데 지금도 동일합니다.

장고에서는 모델 단위 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은 자동으로 호출됩니다.

반응형