Django DRF-在操作响应中将自定义数据添加到序列化程序

Django DRF-在操作响应中将自定义数据添加到序列化程序,django,django-rest-framework,drf-yasg,Django,Django Rest Framework,Drf Yasg,我有一个自定义操作,它获取一个输入,并应返回一个指定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 """

我有一个自定义操作,它获取一个输入,并应返回一个指定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模式。

这里的技巧是只读/只写属性

序列化程序必须如下所示:

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
)
然后它可以像这样返回:

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
)

只是澄清一下,您是否希望在自定义操作响应中包含任务列表?或者在API文档中有一个响应示例?最后两者都有。序列化程序是openapi模式的源代码,但我一直在努力将生成的数据通过序列化程序传回。感谢您的跟进。我在寻找如何更好地记录响应时遇到了这个问题,最后使用了