【发布时间】:2021-09-01 05:32:53
【问题描述】:
下面这句话有什么区别
from django.shortcuts import get_object_or_404
和
from rest_framework.generics import get_object_or_404
【问题讨论】:
标签: django django-rest-framework drf-queryset
下面这句话有什么区别
from django.shortcuts import get_object_or_404
和
from rest_framework.generics import get_object_or_404
【问题讨论】:
标签: django django-rest-framework drf-queryset
django.shortcuts.get_object_or_404 可以引发除Http404 以外的错误(即TypeError、ValueError 和ValidationError),以防传递的kwarg 的类型与所需的类型不匹配。因此,rest_framework.generics.get_object_or_404 只是简单地包装了django.shortcuts.get_object_or_404,这样即使在这些情况下,Http404 仍然会被引发,因为 DRF 在内部使用该函数,并且传递的数据很容易无法匹配所需的数据类型,从而导致意外的 500 错误。
这可以从DRF的source code [GitHub]看到:
from django.shortcuts import get_object_or_404 as _get_object_or_404 def get_object_or_404(queryset, *filter_args, **filter_kwargs): """ Same as Django's standard shortcut, but make sure to also raise 404 if the filter_kwargs don't match the required types. """ try: return _get_object_or_404(queryset, *filter_args, **filter_kwargs) except (TypeError, ValueError, ValidationError): raise Http404
【讨论】:
rest_framework.generics.get_object_or_404 应该更好,因为您正在处理 API,并且更有可能将错误的类型等传递给函数。 (在普通视图中,此类参数主要从 url 作为 kwargs 传递,通常路径转换器应该捕获不正确的类型并给出 404)