get
과 filter
에 대략적인 차이점에 대해서는 인식하고 있지만 보다 정확하게 차이점을 알기 위해서 포스팅을 작성합니다.
get
과 filter
의 대표적인 차이점은 get
은 쿼리에 맞는 객체 하나만 반환해 준다면, filter
는 조건에 맞는 객체 여러개(쿼리셋)을 반환해 준다는 것입니다.
만약 이름에 "test"가 포함된 유저의 정보를 가져오려고 할 때 두 명 이상의 유저가 "test"라는 이름을 포함하고 있다면(두 개 이상의 개체가 발견 된다면) get
은 MultipleObjectRetunred
를 발생시킵니다.
하지만 User.objects.get(name__contains='test')
에서 get
을 filter
로 변경한다면 조건에 맞는 쿼리셋을 반환해 주는 것을 확인 할 수 있습니다.
만약 조건에 해당하는 객체가 존재하지 않는다면 어떻게 될까요?
get
의 경우 DoesNotExist
를 발생시킵니다.
반면 filter의 경우 빈 쿼리셋을 반환하는 것을 확인할 수 있습니다.
간단히 정리하자면
조건에 맞는 하나의 개체를 가져오려면 get
을 사용하고 조건에 맞는 모든 개체를 가져오고 싶을 때는 filter
를 사용합니다.