Создание json-структуры с помощью концепции вложенных сериализаторов

Я пытаюсь сделать api с Django Rest Framework, формат api выглядит следующим образом, я новичок в концепции вложенного сериализатора, поэтому я пытался сделать реляционные модели и вложенный сериализатор, который доступен в документации, но это не работает для меня, есть ли кто-нибудь, кто может помочь?

это мой models.py

это мой serializers.py :

class MPSerializer(serializers.ModelSerializer):
    class Meta:
        model = MP 
        fields = '__all__'
        
class TPSerializer(serializers.ModelSerializer):
    class Meta:
        model = TP 
        fields = '__all__'
        
        
class VFDDSerializer(serializers.ModelSerializer):
    class Meta:
        model = vfdd
        fields = '__all__'    
        
        
class apiSerializer(serializers.ModelSerializer):
    device1=MPSerializer(many=True,read_only=True)
    device2=TPSerializer(many=True,read_only=True)
    device3=VFDDSerializer(many=True,read_only=True)                               
    class Meta:
        model = api
        fields = '__all__'  

и это мои взгляды :

class apiListView(generics.ListCreateAPIView):
    serializer_class= apiSerializer
    queryset= api.objects.all()
    
    
class deviceListView(generics.ListCreateAPIView):
    serializer_class= MPSerializer
    queryset= MP.objects.all()    


         
     

Так что вы можете сделать что-то вроде этого .

Это ваши сериализаторы

class MPSerializer(serializers.ModelSerializer):
    class Meta:
        model = MP 
        fields = '__all__'
        
class TPSerializer(serializers.ModelSerializer):
    class Meta:
        model = TP 
        fields = '__all__'
        
        
class VFDDSerializer(serializers.ModelSerializer):
    class Meta:
        model = vfdd
        fields = '__all__'   

и вы можете создать представление следующим образом

from rest_framework.views import APIView
from . import serializers
from rest_framework.response import Response

Class deviceList(APIView):
   permission_classes = [] # if you have any permission classes.
  
   def get (self, request):
      mp = MpModel.objects.all()
      tp = TpModel.objects.all()
      vfdd = VfddModel.objects.all()

      mp_data = serializers.MPSerializer(mp, many=True).data
      tp_data = serializers.TPSerializer(tp, many=True).data
      vffdd_data = serializers. VFDDSerializer(vfdd, many=True).data

      nested_data = mp_data.extend(tp_data + vffdd_data)
      
      res = {
           "devices": nested_data
          }
      return Response(res)

Надеюсь, это поможет вам решить вашу проблему.

вот мой views.py :

from . import serializers              
class deviceList(APIView):
   permission_classes = [] # if you have any permission classes.
  
   def get (self, request):
      mp = MP.objects.all()
      tp = TP.objects.all()
      vfd = vfddModel.objects.all()

      mp_data = serializers.MPSerializer(mp, many=True).data
      tp_data = serializers.TPSerializer(tp, many=True).data
      vffdd_data = serializers. VFDDSerializer(vfd, many=True).data

      nested_data = mp_data.extend(tp_data + vffdd_data)
      
      res = {
           "devices": nested_data
          }
      return Response(res)

вот мой serializer.py :

from rest_framework import serializers
from django.contrib.auth.models import User
from .real_time_models import *           
class MPSerializer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField(read_only=True)

    def get_type(self, obj):
        return "MP"

    class Meta:
        model = MP 
        fields = '__all__'
        
class TPSerializer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField(read_only=True)

    def get_type(self, obj):
        return "TP"
    class Meta:
        model = TP 
        fields = '__all__'
        
        
class VFDDSerializer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField(read_only=True)

    def get_type(self, obj):
        return "VFDD"

    class Meta:
        model = vfdd
        fields = '__all__'   
Вернуться на верх