django - 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?
解决方案
您可以使用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'"
}
推荐阅读
- sbt - 无法安装或卸载 SBT
- amazon-web-services - S3 存储桶不驻留在 VPC 中?
- vba - vba 英德版excel数据的不同格式
- python - 电话号码的 Python 正则表达式
- c# - 如何从复杂的完整路径字符串中找到 System.Type?
- django - 查看类 dispatch() 找不到方法?
- robotframework - 无法在机器人框架中使用“选择文件”关键字上传图像文件。如何使用机器人框架处理图像上传验证?
- python - 如何调整标签张量的大小,以便我可以在 tf.nn.sigmoid_cross_entropy_with_logits 中使用它
- javascript - Ember 快照无法解析 belongsToRelationships
- electron - 将 create-react-app 与 electron-builder 一起使用