首页 > 解决方案 > 详细视图上的查询参数返回一个列表而不是 json 嵌套序列化程序 Django Rest Framework

问题描述

我对 Django Rest Framework 还很陌生,遇到了一个我不太明白的问题。

如果我设置一个 APIView 来返回特定模型中的所有对象,我会得到预期的数据数组

class ProcedureListView(APIView):

    def get(self, request, format=None):
        procedures = AutomationProcedure.objects.all()
        serializer = AutomationProcedureSerializer(procedures, many=True)
        return Response(serializer.data)

我对这个端点的 api 调用看起来像

$ http --json GET http://localhost:8000/api/procedures/

而响应 [ { ... ... } ]

但是,如果我编写一个采用查询参数的详细视图,则单个对象仍会作为列表返回

class ProcedureDetail(generics.ListAPIView):

 def get_queryset(self):

    queryset = AutomationProcedure.objects.all()
    display_name = self.request.query_params.get('display_name', None)
    if display_name is not None:
        queryset = queryset.filter(display_name=display_name)
    return queryset

然后,如果我以这种方式进行 API 调用:

$ http --json GET http://localhost:8000/api/procedures/ display_name="jenkins"

响应仍然作为列表返回。

[
  {
     ...
     ...
   }
]

现在我知道 Detailview 是从 ListAPIView 继承的,它会以 List 的形式返回是有道理的。但是我应该在这里做什么?覆盖序列化器方法以将其表示为 json 或其他东西?提前感谢您的帮助,这是一个艰难的过程

所需的输出将类似于

{ ... ... # 各种嵌套对象

}

数据完全按照我想要的方式出现,除了周围的 [] 用于详细信息视图。如果我重写方法并做类似的事情

return Response(serializer.data[0]) 

这很完美。但似乎有点hacky

这是我的序列化程序

class AutomationTemplateParameterSerializer(serializers.ModelSerializer):

    class Meta:
        model = AutomationTemplateParameter
        fields = ['sys_automation_template_parameter_id', 'sys_automation_template_id', 'parameter_name',
              'parameter_value', 'default_value', 'description', 'display_name']


class AutomationTemplateSerializer(serializers.ModelSerializer):

    template_parameters = AutomationTemplateParameterSerializer(many=True)

    class Meta:
        model = AutomationTemplate
        fields = ['sys_automation_template_id', 'template_name', 'template_code',
              'template_code', 'display_name', 'description', 'template_parameters']


class AutomationProcedureSerializer(serializers.ModelSerializer):

    procedure_template = AutomationTemplateSerializer(many=True)

    class Meta:
    model = AutomationProcedure
    fields = ['sys_automation_procedure_id', 'sys_application_service_id', 'procedure_code', 'description', 'display_name', 'command_line_args',
              'procedure_template']
    lookup_field = 'display_name'

    def to_representation(self, instance):
        procedures = super(AutomationProcedureSerializer, self).to_representation(instance)
        return {'procedures': procedures}

编辑:

我已经更新了使用 RetrieveApiView 泛型的方法。我似乎没有收到以前的属性错误,但现在正则表达式似乎不起作用

class ProcedureDetail(generics.RetrieveAPIView):
    queryset = AutomationProcedure
    serializer_class = AutomationProcedureSerializer
    lookup_field = ('display_name')

网址

url(r'^(?P<display_name>[a-zA-Z]+(?i))$', views.ProcedureDetail.as_view()),

api响应

http --json GET http://localhost:8000/api/procedures/ display_name="Jenkins"


 Not Found: /api/procedures/
[24/Jul/2018 15:37:59] "GET /api/procedures/ HTTP/1.1" 404 2640

标签: pythonjsondjangodjango-rest-frameworkoutput

解决方案


推荐阅读