python - 详细视图上的查询参数返回一个列表而不是 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
解决方案
推荐阅读
- sql - 我可以在 Redshift sql 上获得一些线索,以将列值从 {NEWHP}{E_6123} 转换为 NEWHP_18_SN_123
- docusignapi - Docusign Admin Api getUserProfile 上的问题
- javascript - 从反应中的函数返回值
- python - 从给定的输入年份打印接下来 15 年的闰年
- amazon-web-services - 在 Fn::if 中使用多个 Fn::Sub
- android - 即使 URI 是应用程序链接,如何显示选择器对话框
- flutter - 颤振:错误:非抽象类'RenderParagraphX'缺少这些成员的实现,由sliding_up_panel-1.0.2引起
- amazon-dynamodb - 如何跨许多 Java 应用程序分析性能 aws dynamodb 调用
- html - 根据按钮大小自动调整输入大小?
- python - Trying to reach url with Path include() shows 404 in Django