简体   繁体   English

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

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

I have a serializer for DRF, and drf-spectacular.我有一个用于 DRF 的序列化程序和 drf-spectacular。 My serializer works that i expect but in GUI don't present currectly.我的序列化程序可以正常工作,但在 GUI 中不能正确显示。 So i need to have tho diffrents serializer one for schema and second for endpoint.所以我需要有不同的序列化器,一个用于模式,第二个用于端点。 But i wanna use one, how to fix this?但我想用一个,如何解决这个问题?

My serializer:我的序列化器:

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

Schema serializer:模式序列化器:

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

Api endpoint: 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)

When i use to show schema normal selialiser i have:当我用来显示模式正常的seliizer时,我有:

在此处输入图像描述

in schema serializer:在模式序列化程序中:

在此处输入图像描述

How to fix first serializer and have one for schema and get method?如何修复第一个序列化程序并有一个用于模式和获取方法?

Since your models are related, you could just nest serializers .由于您的模型是相关的,因此您可以嵌套 serializers Here's a simple example:这是一个简单的例子:

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

Note that I used ModelSerializer everywhere as it already implements some logic for creating resources (not interesting in your use case if it's only returning data to the caller) and automatically maps model fields to DRF fields.请注意,我在任何地方都使用ModelSerializer ,因为它已经实现了一些用于创建资源的逻辑(如果它只是将数据返回给调用者,则在您的用例中并不感兴趣)并自动将 model 字段映射到 DRF 字段。

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

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