【问题标题】:DRF - Add custom data to serializer in action responseDRF - 在动作响应中将自定义数据添加到序列化程序
【发布时间】:2020-05-28 19:32:55
【问题描述】:

我有一个自定义操作,它获取输入并应返回已分配 cidr 对象的列表。

    @action(detail=True, methods=['POST'], name="Assign Subnet from Pool", serializer_class=AssignmentSerializer)
    def assign(self, request, pk=None):
        """Adds a new address within the pool
        """
        pool = self.get_object()

        serializer = AssignmentSerializer(data=request.data)
        if not serializer.is_valid():
            return Response(status=status.HTTP_412_PRECONDITION_FAILED)

        # Computation generating a dictionary with cidr objects (result)

        # Successfully assigned
        serializer.save(assignments=[cidr for cidr in result.values()])

        return Response(serializer.data, status=status.HTTP_201_CREATED)

我的序列化器看起来像这样

class AssignmentSerializer(serializers.Serializer):
    """This is a serializer for a custom form
    """
    hostname = serializers.CharField(required=False)
    useDefaultDomain = serializers.BooleanField(default=True, help_text='Use pools default domain')
    description = serializers.CharField(required=True)
    assignments = CIDRSerializer(many=True, required=False, help_text='Will not be evaluated on request but contain the assignments in the response')

但是,我还没有弄清楚如何在响应中包含分配。序列化器不需要将它们持久化到数据库中,只需使用序列化器自动生成 openapi 模式即可。

【问题讨论】:

  • 澄清一下,您想在自定义操作响应中包含分配列表吗?或者有 API 文档中的响应示例?
  • 最后都是。序列化程序是 openapi 模式的来源,但我一直在努力将生成的数据通过序列化程序传回。
  • 感谢您的跟进。我遇到了这个问题,寻找如何更好地记录回复,并最终使用了custom schema functional decorator

标签: django django-rest-framework drf-yasg


【解决方案1】:

这里的技巧是 read_only/write_only 属性。

序列化器必须如下所示:

class AssignmentSerializer(serializers.Serializer):
    hostname = serializers.CharField(required=False, write_only=True)
    useDefaultDomain = serializers.BooleanField(default=True, write_only=True, help_text='Use pools default domain')
    description = serializers.CharField(required=True, write_only=True)
    assignments = CIDRSerializer(many=True, read_only=True)

然后可以这样返回:

return Response(
    AssignmentSerializer(
        instance={
            'assignments': list(result.values())
        },
        read_only=True,
        context={'request': request}
    ).data,
    status=status.HTTP_201_CREATED
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多