review 중에 get_object로 가져오면 자동으로 404 에러를 띄워주니까
404 에러를 raise 하지 말라는 리뷰를 받았다.
def get_object(self):
"""
Returns the object the view is displaying.
You may want to override this if you need to provide non-standard
queryset lookups. Eg if objects are referenced using multiple
keyword arguments in the url conf.
"""
queryset = self.filter_queryset(self.get_queryset())
# Perform the lookup filtering.
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
assert lookup_url_kwarg in self.kwargs, (
'Expected view %s to be called with a URL keyword argument '
'named "%s". Fix your URL conf, or set the `.lookup_field` '
'attribute on the view correctly.' %
(self.__class__.__name__, lookup_url_kwarg)
)
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
obj = get_object_or_404(queryset, **filter_kwargs)
# May raise a permission denied
self.check_object_permissions(self.request, obj)
return obj
위처럼 get_object() 메서드는 get_object_or_404() 메서드를 가져다가 쓰므로 내부적으로 404 처리를 한다.
def get_object_or_404(klass, *args, **kwargs):
"""
Use get() to return an object, or raise an Http404 exception if the object
does not exist.
klass may be a Model, Manager, or QuerySet object. All other passed
arguments and keyword arguments are used in the get() query.
Like with QuerySet.get(), MultipleObjectsReturned is raised if more than
one object is found.
"""
queryset = _get_queryset(klass)
if not hasattr(queryset, "get"):
klass__name = (
klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
)
raise ValueError(
"First argument to get_object_or_404() must be a Model, Manager, "
"or QuerySet, not '%s'." % klass__name
)
try:
return queryset.get(*args, **kwargs)
except queryset.model.DoesNotExist:
raise Http404(
"No %s matches the given query." % queryset.model._meta.object_name
)
get_object_or_404() 메서드는 object가 없으면 404 에러를 raise 한다.
그래서 get_object()를 사용하면 if else로 따로 raise error 처리를 안해줘도 된다.
'Python > django' 카테고리의 다른 글
UniqueConstraint (0) | 2023.06.21 |
---|---|
count() 과 len() 차이 (0) | 2023.06.16 |
Django OneToOne Field 사용 지양하는 이유 (0) | 2023.05.24 |
Django Migration 사용 안하고 DDL 사용하기(2) (0) | 2023.05.17 |
Django Migration 사용 안하고 DDL 사용하기(1) (1) | 2023.05.16 |