[django] DoesNotExist 에러 (vs. KeyError)

EMMA·2022년 3월 26일
0

django 코드 복습하다가 궁금하여 써보는,
DoesNotExist vs. KeyError


둘은 정확히 무슨 차이야..? 🧐

python 공식문서에서 설명하는 KeyError는 아래와 같다.

  • 매핑 (dictionary) 형태에서 발생한다
  • key값이 집합에서 발견되지 않을 때 발생

클라이언트가 서버에게 JSON 형태로 데이터를 넘겨주면,
나는 django를 통해 이를 dict 형태 - {key:value} 로 변환한다.

회원가입/로그인 api 를 만들 때 사용자가 필요한 key값을 입력하지 않으면 KeyError를 raise해 필요한 value값을 모두 받을 수 있도록 설정하는 것이다.

python과 django에서 제공하는 예외/에러는 다르다.
"Django raises some of its own exceptions as well as standard Python exceptions"

DoesNotExist 또한 예외/에러인데, 이는 python이 아닌 django에서 제공하는 예외다.

  • ObjectDoesNotExist는 django.core.exceptions에서 정의하는 클래스 중 하나로,
    model.DoesNotExist의 base class다
  • model.DoesNotExist 는 ORM이 raise하는 에러다. get()을 사용해서 database 데이터를 조회할 때, 해당 인스턴스가 없을 경우 발생한다. (MultipleObjectsReturned는 반대의 경우라 할 수 있겠다)
#User에 인스턴스(id -999)가 없을 경우, 
User.objects.get(id=-999)
>>> User.DoesNotExist

#2개 이상의 인스턴스가 발생하는 경우  
User.objects.get(last_name="홍")
>>> User.MultipleObjectsReturned

그래서 DoesNotExist를 다루고 싶으면, try-except문으로 잡거나
아예 ObjectDoesNotExist를 import하면 된다. (예시 출처: django documentation)

from django.core.excpetions import ObjectDoesNotExist 

try:
    blog = Blog.objects.get(id=1)
    entry = Entry.objects.get(blog=blog, entry_number=1)
except ObjectDoesNotExist:
    print("Either the blog or entry doesn't exist.")

참고 문서
https://docs.python.org/ko/3/library/exceptions.html#KeyError
https://docs.djangoproject.com/en/4.0/ref/exceptions/

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글