首页 > 解决方案 > Django REST 框架:如何使用 get_queryset() 响应有用的错误消息

问题描述

我有一个 Django 模型,我想通过 Django Rest 框架显示它。我让模型中的所有对象都通过get_queryset(). 但是,我也有几个query_params会过滤掉某些对象。这是我工作正常的主要代码:

class PlanView(generics.ListAPIView):
    """
    API endpoint which allows prices to be viewed or edited
    """

    serializer_class = PlanSerializer
    permission_classes = (IsAuthenticatedOrReadOnly,)

    # override method
    def get_queryset(self):
        //get all objects in Plan model
        queryset = Plan.objects.all()

        // possible query parameters to be read from url
        size = self.request.query_params.get("size", None)
        price = self.request.query_params.get("price", None)

        if size is not None:
            if size == "large":
                queryset = queryset.filter(Large=True)
            elif size == "small":
                queryset = queryset.filter(Large=False)

        if price is not None:
            queryset = queryset.filter(price=price)

        return queryset

有了这个urlpattern

path(r'API/plans', views.PlanView.as_view(), name='prices'),

唯一的问题是,当我故意在浏览器中编写以下 URL 时,

http://127.0.0.1:8000/API/plans?size=sm

它有一个错误/拼写错误query_param的值,get_query() 代码将忽略它并显示对象,就好像没有过滤器一样。

我试图提出一个 else 语句,例如:

    if size is not None:
            if size == "large":
                queryset = queryset.filter(Large=True)
            elif size == "small":
                queryset = queryset.filter(Large=False)
            else:
                return Response({"Error":"bad request"}, status=status.HTTP_400_BAD_REQUEST)

但是有了这个,我收到一条错误消息:

ContentNotRenderedError at /API/plans
The response content must be rendered before it can be iterated over.

如果用户在 API 中输入错误的参数值,我如何显示有用的错误响应/json?

标签: djangorestapidjango-rest-frameworkhttp-status-codes

解决方案


您可以使用ValidationError

from rest_framework.exceptions import ValidationError
# ...
        raise ValidationError(detail="size must be either 'large' or 'small'")

DRF 捕获这些异常并整齐地显示它们。它返回表单的 JSON

{
    "detail": "size must be either 'large' or 'small'"
}

推荐阅读