Python 使用序列化程序作为查询参数验证器是一种好的做法吗?

Python 使用序列化程序作为查询参数验证器是一种好的做法吗?,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,序列化程序不会用于创建某些django模型的预期目的,但它将用于查询参数验证、创建对elasticsearch的过滤查询、描述API的大摇大摆文档 from rest_framework import views, serializers, fields from rest_framework.response import Response class TestQueryParams(serializers.Serializer): id = fields.IntegerField

序列化程序不会用于创建某些django模型的预期目的,但它将用于查询参数验证、创建对elasticsearch的过滤查询、描述API的大摇大摆文档

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'})

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


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

Django已经有了这个内置项-这称为表单:看起来没有办法从表单自动生成swagger文档。的确没有,恐怕我错过了这一部分……问题是,如果我使用serializer,我必须破解swagger,因为serializer的文档将只为PUT、PATCH和POST方法生成,这可以在中看到,如果您使用
drf yasg
,您可以使用
@swagger\u auto\u模式(query\u serializer=MyQuerySerializer)
,这将显示在Swagger/OpenAPI模式中。有点难找到,但效果很好。我相信400状态代码比500状态代码更好。让API返回500个错误不是一个好做法。当您知道可能发生哪些错误并可以检查它们时,您应该让API返回正确的错误代码和消息。在这种情况下,它将是状态代码400。