【问题标题】:difference between django.shortcuts and rest_framework.genericsdjango.shortcuts 和 rest_framework.generics 的区别
【发布时间】: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


    【解决方案1】:

    django.shortcuts.get_object_or_404 可以引发除Http404 以外的错误(即TypeErrorValueErrorValidationError),以防传递的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)
    猜你喜欢
    • 2020-05-05
    • 2021-11-16
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    • 2014-10-09
    • 2010-12-21
    • 2011-05-11
    相关资源
    最近更新 更多