[Django] get object or 404 ❓ objects.XXX ❓

sorzzzzy·2021년 11월 23일
0

TIL

목록 보기
10/36
post-thumbnail

며칠 전 장고로 해커톤을 진행하면서 생긴 궁금증!

객체를 조회할 때 쓰는 get object or 404objects.filter() !
비슷해 보이는 두 가지 방법에 대해서 알아보자!


1️⃣ get_object_or_404

get_object_or_404(MyModel, pk=pk)

➡️ 이 코드는,

try:
    my_model = MyModel.objects.get(pk=pk)
except:
    raise Http404

➡️ 이 코드와 같은 로직이다

  1. 모델의 예외 대신 발생
  2. 만약 객체가 존재하지 않을 때 get()을 사용하여 Http404에러를 발생시킴
  3. Django 모델을 첫번째 인자로 받고, 몇 개의 키워드 인수를 모델 관리자의 get() 함수에 넘김

🤔 : 상위 계층에서 ObjectDoesNotExist 예외를 자동으로 잡아 내는 대신 get_object_or_404() 를 사용하거나, ObjectDoesNotExist 예외를 사용하는 대신 Http404 를 사용하는 이유는 뭘까?
💡 : 모델 계층을 뷰 계층에 연결하는 방법이기 때문!!


2️⃣ Model.objects.XXX()

아주 기본적인 쿼리셋 검색 방법임!!


all()

➡️ 검색 결과가 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 전체를 불러옴

filter()

➡️ 검색 결과가 2개 이상이 나올 수 있음

>>> Person.objects.filter(name='홍길동')
Person.objects.filter(id=1)

➡️ 해당되는 값을 모두 불러옴


get()

➡️ get()은 값 1개만 불러옴.
➡️ filter 와 다른 점은 값이 없을 때 filter는 빈 쿼리셋을 불러 오고 getDoesNotExist라는 메시지를 띄워줌.
➡️ 그리고 해당하는 값이 한 개가 아닐 경우에는 MultipleObjectsReturned 라는 메시지를 띄움.
➡️ get 은 쿼리셋을 호출하는 것이 아니라서 뒤에 다른 메소드를 추가할 수 없음.


참고 자료

profile
Backend Developer

0개의 댓글