며칠 전 장고로 해커톤을 진행하면서 생긴 궁금증!
객체를 조회할 때 쓰는 get object or 404
와 objects.filter()
!
비슷해 보이는 두 가지 방법에 대해서 알아보자!
get_object_or_404(MyModel, pk=pk)
➡️ 이 코드는,
try:
my_model = MyModel.objects.get(pk=pk)
except:
raise Http404
➡️ 이 코드와 같은 로직이다
get()
을 사용하여 Http404
에러를 발생시킴get()
함수에 넘김🤔 : 상위 계층에서
ObjectDoesNotExist
예외를 자동으로 잡아 내는 대신get_object_or_404()
를 사용하거나,ObjectDoesNotExist
예외를 사용하는 대신Http404
를 사용하는 이유는 뭘까?
💡 : 모델 계층을 뷰 계층에 연결하는 방법이기 때문!!
아주 기본적인 쿼리셋 검색 방법임!!
➡️ 검색 결과가 2개 이상이 나올 수 있음
>>> Person.objects.all()
<QuerySet [<Person: 홍길동>]>
Person.objects.all()
queryset
전체를 불러옴>>> Person.objects.values()
<QuerySet [{'name': '홍길동', 'gender': 'male', 'age': 15}, {'name': '신사임당', 'gender': 'female', 'age': 35}]>
Person.objects.values()
queryset
전체를 불러옴➡️ 검색 결과가 2개 이상이 나올 수 있음
>>> Person.objects.filter(name='홍길동')
Person.objects.filter(id=1)
➡️ 해당되는 값을 모두 불러옴
➡️ get()
은 값 1개만 불러옴.
➡️ filter
와 다른 점은 값이 없을 때 filter
는 빈 쿼리셋을 불러 오고 get
은 DoesNotExist
라는 메시지를 띄워줌.
➡️ 그리고 해당하는 값이 한 개가 아닐 경우에는 MultipleObjectsReturned
라는 메시지를 띄움.
➡️ get
은 쿼리셋을 호출하는 것이 아니라서 뒤에 다른 메소드를 추가할 수 없음.