使用序列化程序作为查询参数验证器是一个好习惯吗?

Žil*_*nis 9 python django rest django-rest-framework

Serializer 不会用于创建一些 django 模型的预期目的,但它会用于查询参数验证、创建对 elasticsearch 的过滤查询、描述 API 的 swagger 文档。

from rest_framework import views, serializers, fields
from rest_framework.response import Response


class TestQueryParams(serializers.Serializer):
    id = fields.IntegerField(min_value=0)
    date = fields.DateField(format='%Y%m%d')


class TestView(views.APIView):
    def get(self, request):
        qp = TestQueryParams(data=request.query_params)
        qp.is_valid(raise_exception=True)
        # parameters would not be used to create some model
        # but they would be used to get data
        return Response({'some': 'data'})
Run Code Online (Sandbox Code Playgroud)

arj*_*n27 11

绝对是一个好习惯,因为序列化程序将自动验证字段,并在需要时引发正确的异常。

另一种方法是在视图中手动定义这些验证,或者更糟 - 每当发送不正确的输入时,让您的 API 返回 500 个服务器错误。

  • 如果您使用的是 `drf-yasg`,您可以使用 `@swagger_auto_schema(query_serializer=MyQuerySerializer)` 注释您的 API 调用,这将显示在 Swagger/OpenAPI 架构中。[文档](https://drf-yasg.readthedocs.io/en/stable/openapi.html) 有点难找到,但效果很好。 (2认同)
  • 我相信 400 状态代码比 500 更好。 (2认同)