【问题标题】:How to simplify DRF GET query params validation and request set filter如何简化 DRF GET 查询参数验证和请求集过滤器
【发布时间】:2022-01-13 13:46:59
【问题描述】:

我对 DRF 非常陌生,并且需要使用 DRF 的 REST API URL,这将允许 2 个或多个参数,但应该需要一个参数,即:需要句点并且实体可以为空白

http://127.0.0.1:8000/myapi/?entity=&period=FEB-21

我创建了如下 APIView:

class myAPI_Viw(APIView):
    serializer_class = myAPI_Serializers
    
    def get(self, request, format=None):
        entity_param = self.request.query_params.get('entity')
        period_param = self.request.query_params.get('period')

        if (entity_param in (None, '') and period_param in (None, '')):
            return Response({"status": "Error", "data": "Invalid parameter, period should have value"}, status=status.HTTP_400_BAD_REQUEST)

        if (entity_param in (None, '') and period_param not in (None, '')):
            rs = myAPI.objects.filter(period_name=period_param)
            print(rs.query)
        else:
            rs = myAPI.objects.filter(entity=entity_param, period_name=period_param)
            print(rs.query)
        serializer = myAPI_Serializers(rs, many=True)
        return Response({"status": "Success", "data": serializer.data}, status=status.HTTP_200_OK)

以上代码运行正常。 只是想知道:

  1. 任何更好的验证方法
  2. 视图和序列化程序级别的验证有什么区别
  3. 是否有任何方法可以将过滤器组合到一个调用中,以便 entity=entity_param 即使传入的值为空白也能正常工作

提前非常感谢, 防御

2.

【问题讨论】:

    标签: django-rest-framework django-views


    【解决方案1】:

    您的问题答案:

    1. 您可以使用装饰器进行验证。
    2. 仅对 POST、PATCH 和 PUT 请求调用序列化程序的验证方法。因此,对于 GET 请求,如果您需要验证,则必须在视图上对其进行验证(对于干净的代码,您可以使用装饰器)
    3. 您可以直接使用 entity_param 进行过滤,即使它是 None。在这种情况下,您将获得空查询集。

    【讨论】:

    • 1.是否可以将装饰器用于基于类的视图。 2. 直接使用 entity_param 进行过滤,如果为 None,则会给出空查询集。如果它是None,是否可以直接调用model.objects.filter来过滤具有现有实体值的实体。
    • 1.是的 2. 你的问题我可能不清楚。但是,您可以像这样使用 or 运算符 - entity_param = self.request.query_params.get('entity') 或 ""
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多