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