다대다 관계에 있는 테이블 A와 B 두개를 엮는 중간 테이블 AB가 있다. 이때, AB테이블에서 A테이블의 필드 a와 B테이블의 필드 b의 쌍이 unique해야 한다. 각 필드를 데이터베이스 레벨에서 유니크로 설정하면 ab' 쌍이나 a'b쌍이 만들어지지 않기 때문에 그렇게 할 수는 없었다. 어떻게 해결했는지에 대한 과정!
REST framework에서의 validation은 serializer에서만 시행되는데 데이터를 직렬화할 때 적용되는 규칙을 한 곳에서만 정의하면 되기 때문에 매우 유용하다. 그동안 나는 프로젝트에서 validation을 많이 활용하지 않았기 때문에 이게 얼마나 유용한지 몰랐다!
validator 이용할 생각을 하기 전에는 update 메서드를 상속받아서 a와 b가 함께 있는 객체를 필터링이 존재하면 exception을 raise하는 방식으로 하려고 했다. 그러나 이렇게 하니 내가 원하는 에러 메세지를 뿌릴 수 없고 500에러로만 처리해야 한다는 점이 너무 찝찝했다.
그 때 발견한것이 uniquetogethervalidator! 내가 타게팅하는 쿼리셋과 하나의 쌍이 unique하게 존재하야하는 필드값의 이름만 입력해주면 된다.
이렇게 세팅해주었을 때, 유니크한 쌍이 아닌 객체를 만드려고 시도하면 다음과 같은 에러가 난다: