嵌套序列化程序的 Yasg 模式生成显示不正确的请求/响应

问题描述

我有一个 Django API,我尝试使用 drf-yasg 创建文档。我的嵌套序列化程序和 ListAPIview 的自动生成模式遇到问题。它看起来像这样:

serializers.py

import pandas as pd
def convert(x):
    if isinstance(x,int):
        return x
    elif isinstance(x,float):
        return int(x)
    else:
        # Defaults to 0 when not convertable
        return 0
    print(x)

df = pd.DataFrame({'col': [23145,23145.0,'No value kNown']})
df['col'] = df['col'].apply(convert)

views.py

class SlideDataSerializer(serializers.ModelSerializer):
    description = SlideDataDescriptionSerializer(many=True,read_only=True,source='slidedatadescription_set')
    class Meta:
        model = SlideData
        fields = ['catch','title','description','icon']


class SlideSerializer(serializers.ModelSerializer):
    datas = SlideDataSerializer(many=True,source='slidedata_set')
    class Meta:
        model = Slide
        fields = ['datas']

class PlanDataDescriptionSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlanDataDescription
        fields = ['description']

class PlanDataSerializer(serializers.ModelSerializer):
    description = PlanDataDescriptionSerializer(many=True,source='plandatadescription_set')
    class Meta:
        model = PlanData
        fields = ['stripColor','name','pricePerMonth','currency','picture']


class PlanSerializer(serializers.ModelSerializer):
    datas = PlanDataSerializer(many=True,source='plandata_set')
    class Meta:
        model = Plan
        fields = ['mainTitle','datas']

和 urls.py:

class ProjectList(generics.ListAPIView):
    permission_classes = [permissions.AllowAny]
    serializer_class_slide = SlideSerializer
    serializer_class_plan = PlanSerializer

    def get_queryset_object(self,Table,campaign,lang):
        queryset = Table.objects.filter(campaign__name=campaign).filter(language__alpha2=lang)
        return queryset[0]

    def list(self,request):
        Tables = [Slide,Plan]


        campaign = self.request.query_params.get('campaign') or "default"
        lang = self.request.query_params.get('lang') or "en"

        if not all(Table.objects.filter(campaign__name=campaign).filter(language__alpha2=lang) for Table in Tables):
            campaign = "default"

        if not all(Table.objects.filter(campaign__name=campaign).filter(language__alpha2=lang) for Table in Tables):
            lang = "en"

        slides = self.serializer_class_slide(self.get_queryset_object(Slide,lang))
        plans = self.serializer_class_plan(self.get_queryset_object(Plan,lang))

        return Response({
            "slides": slides.data,"plans": plans.data,})

端点工作正常,但 swagger 没有创建正确的请求或响应,当我访问它时,它给了我这个错误消息:

openapi_info = openapi.Info(
        title="Projectname",default_version="v1",description="Endpoints",terms_of_service="TBD",contact=openapi.Contact(email="abc@123.com"),license=openapi.License(name="BSD License"),)

schema_view = get_schema_view(
    openapi_info,public=True,permission_classes=(permissions.AllowAny,),)

API_VERSION = 'v1'
urlpatterns = [
    path('swagger/',schema_view.with_ui(
        'swagger',cache_timeout=0),name='schema-swagger-ui'),path('swagger/api.json',schema_view.without_ui( cache_timeout=0),name='schema-swagger-json'),]

我无法包含序列化器类名,因为我使用了多个序列化器,我无法为此创建单个序列化器,因为它们被拆分到不同的模型中。覆盖 get_serializer_class() 没有用,因为我也不知道如何在那里合并这些序列化程序。我怎样才能使这个表示工作?提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)