繁体   English   中英

Django Rest 框架 - 一个用于 API 和 drf-spectacular 的 serailizer

[英]Django Rest Framework - One serailizer for API and drf-spectacular

我有一个用于 DRF 的序列化程序和 drf-spectacular。 我的序列化程序可以正常工作,但在 GUI 中不能正确显示。 所以我需要有不同的序列化器,一个用于模式,第二个用于端点。 但我想用一个,如何解决这个问题?

我的序列化器:

class GetConversionCasesSerializer(serializers.Serializer):
    conversionId = serializers.SerializerMethodField()
    cases = serializers.SerializerMethodField()

    def get_cases(self, obj):
        serializer = ResultDataSerializer(ResultData.objects.filter(conversion=obj), many=True)
        data = serializer.data
        return data

    def get_conversionId(self, obj):
        return obj.id

模式序列化器:

class GetConversionCasesSerializerSchema(serializers.Serializer):
    conversionId = serializers.IntegerField()
    cases = serializers.ListSerializer(child=ResultDataSerializer())

Api 端点:

    @extend_schema(request=None, responses=GetConversionCasesSerializerSchema())
def get(self, *args, **kwargs):
    if self.request.version == "v1":
        conversion_id = self.kwargs.get('conversion_id')
        instance = Conversion.objects.get(id=conversion_id)
        serializer = GetConversionCasesSerializer(instance)
        return Response(serializer.data)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)

当我用来显示模式正常的seliizer时,我有:

在此处输入图像描述

在模式序列化程序中:

在此处输入图像描述

如何修复第一个序列化程序并有一个用于模式和获取方法?

由于您的模型是相关的,因此您可以嵌套 serializers 这是一个简单的例子:

from rest_framework import serializers

from app.models import Conversion, ResultData


class ResultDataSerializer(serializers.ModelSerializer):
    # TODO: Define only the attributes you're interested
    class Meta:
        model = ResultData
        fields = '__all__' 


class GetConversionCasesSerializer(serializers.ModelSerializer):
    conversionId = serializers.CharField(source='id')
    cases = ResultDataSerializer(many=True, source='resultdata_set')  # `source` depends on your case

    class Meta:
        model = Conversion
        fields = ('id', 'resultdata_set',)  # add other fields of interest

请注意,我在任何地方都使用ModelSerializer ,因为它已经实现了一些用于创建资源的逻辑(如果它只是将数据返回给调用者,则在您的用例中并不感兴趣)并自动将 model 字段映射到 DRF 字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM