如何向基于功能的视图添加过滤器后端?

时间:2019-01-24 16:27:27

标签: django django-rest-framework swagger

我需要在Django应用程序中公开某个方法。该方法不涉及任何模型或序列化器,只是计算上的。因此,我认为这是使用Function Based Views的好地方。我也希望这种观点大张旗鼓地出现。可以,但是 没有位置供用户插入数据 (请参见屏幕截图): enter image description here

如果我使用的是GenericAPIView,则可以设置filter_backends,但我什至不知道使用功能基础视图是否可以实现。

任何帮助都是值得的。谢谢!

更新:这是我要公开的方法:

@api_view(['POST'])
def host_pre_mm_check(request):

        ... do a bunch of computation ...

        response_dict = {
            "cluster_name": cluster_name,
            "failed": failed_host_names,
            "passed": passed_host_names
        }
        return Response(response_dict, status=status.HTTP_200_OK)

上述方法希望接收如下所示的json数据:

{
   "cluster_name" : "A-VIF012",
   "host_names" : [
      "avif012-03.example.com",
      "avif012-05.example.com",
      "avif012-06.example.com",
   ]
}

更新2:我一直在尝试使用Tobey的很好的建议,但是我仍然大张旗鼓地得到相同的结果。这是我根据Tobey的建议进行的修改:

在我的view.py中,我添加了以下几行:

from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema
from .serializers import *

class CustomAutoSchema(AutoSchema):
    pass

@api_view(['POST'])
@schema(CustomAutoSchema())
def cluster_host_pre_mm_check(request):

    ... lots of computational code ...

        response_dict = {
            "cluster_name": cluster_name,
            "failed": failed_host_names,
            "passed": passed_host_names
        }
        serializer = ClusterHostPreMMCheck(data=response_dict)
        serializer.is_valid(raise_exception=True)
        data = serializer.validated_data
        return Response(data, status=status.HTTP_200_OK)

cluster_host_pre_mm_check.get_serializer = lambda *args: ClusterHostPreMMCheck

在我的serializers.py中,我添加了以下代码:

class StringListField(serializers.ListField):
    child = serializers.CharField()


class ClusterHostPreMMCheck(serializers.Serializer):
    cluster_name = serializers.CharField(max_length=100)
    passed = StringListField()
    failed = StringListField()

但是我的使用者界面上仍然没有空间供用户输入任何输入。

更新3:

考虑了Tobey关于定义序列化器的建议后,我决定放弃使用功能基础视图,并定义了GenericAPIView。然后,我定义了两个序列化器类。一种用于输入数据,一种用于输出数据。我将serializer_class设置为定义的输入串行器,并在对响应进行序列化时在post()方法中使用了输出串行器。

1 个答案:

答案 0 :(得分:1)

您可以使用rest framework的视图shema装饰器来实现此目的

  

要覆盖基于函数的视图的默认架构生成,可以使用@schema装饰器。这必须在@api_view装饰器之后(下方)进行。例如:

from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema
from rest_framework.serializers import Serializer

class MySerializer(Serializer):
    a = serializers.CharField(max_length=100)
    b = serializers.CharField(max_length=100)


class CustomAutoSchema(AutoSchema):
    pass

@api_view(['GET'])
@schema(CustomAutoSchema())
def my_view(request):

    <.. do computation>
    result = {'a': 'ad', 'unwanted': None}

    # Validate payload before returning
    serializer = MySerializer(data=result)
    serializer.is_valid(raise_exception=True)
    data = serializer.validated_data  # {'a': 'ad'}

    return Response(data)

my_view.get_serializer = lambda *args: MySerializer

注意: filter_backends仅用于过滤器参数,不适用于架构定义

更新:

Looking at the source code get_link产生了交互式页面中使用的核心api链接。

对于您而言,我建议您使用逻辑get_serializer_fields

因此,在定义my_view

之后

添加

my_view.get_serializer = lambda *args: MySerializer

在所有字段中都定义了MySerializer的地方