get_object() 메서드는 무엇인가?
: pk로 queryset을 필터링 하고, 필터링을 통해 queryset에서 pk에 맞는 object를 return 시켜주는 메서드이다.
비교
# DRF get_object()
first = self.get_object()
# Django ORM
second = Second.objects.get(pk=pk)
위 두가지 예시의 코드들은 같은 역할을 한다고 생각하면 쉽다.
get_object()
# get_object 소스 코드
def get_object(self, queryset=None):
"""
Returns the object the view is displaying.
By default this requires `self.queryset` and a `pk` or `slug` argument
in the URLconf, but subclasses can override this to return any object.
"""
# 제공된 custom queryset을 사용합니다.
# like DateDetailView
if queryset is None:
queryset = self.get_queryset()
# 다음, pk로 검색을 시도합니다.
pk = self.kwargs.get(self.pk_url_kwarg, None)
slug = self.kwargs.get(self.slug_url_kwarg, None)
if pk is not None:
queryset = queryset.filter(pk=pk)
# 다음, slug로 검색을 시도합니다.
if slug is not None and (pk is None or self.query_pk_and_slug):
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: slug})
# 이들 중 어느것도 포함되어 있지 않다면 에러를 발생시킵니다.
if pk is None and slug is None:
raise AttributeError("Generic detail view %s must be called with "
"either an object pk or a slug."
% self.__class__.__name__)
try:
# 필터링된 queryset에서 object를 가져옵니다.
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name})
return obj # Customer.object.get(pk=pk) 의미
# get_serializer 소스 코드
def get_serializer(self, instance=None, data=None,
files=None, partial=False):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_serializer_class()
context = self.get_serializer_context()
return serializer_class(instance, data=data, files=files,
partial=partial, context=context)
먼저, 첫 if 문을 확인해보면 사용자가 작성한 queryset 즉, custom queryset이 있는지 확인해본다. custom queryset이 있다면 그것을 호출시켜서 함수를 진행한다. 만약 없다면 object의 기본 queryset을 참조하게 되어있다.
그 다음은, pk를 통해서 queryset을 필터링하게 된다. pk가 정의되어있지 않다면 바로 slug를 확인해서 필터링을 시도한다.
만약 pk, slug 둘다 정의되어 있지 않다면 AttributeError를 발생시킨다.
마지막으로, queryset에서 object를 get() 메서드로 추출하고 return 하면서 함수를 종료한다.
즉, get_object() 메서드는 pk나 slug 필드로 object를 가져올때 사용된다.
'Django > DRF' 카테고리의 다른 글
[DRF] queryset과 get_queryset()의 차이점 (0) | 2022.05.26 |
---|---|
[Django] DecimalField (0) | 2022.05.25 |
[Django rest Framework] Swagger 문서 자동화 ( drf-yasg ) (0) | 2022.04.22 |
[Django rest framework] TDD - Unit Test (0) | 2022.04.20 |
[Django] ContentType (0) | 2022.03.29 |