Cómo devolver json anidado por Django Rest Framework

Sep 12 2020

Tengo datos dentro de la base de datos de Postgres como este

y quiero crear rest api para devolver json anidado como este

[
{
    "machine": "MC1",
    "work"   : [
                 {
                    "title": "21TCE20200910",
                    "subTitle1": "INSERT CORE",
                    "subTitle2": "P20200910-001",
                    "subTitle3": "DRAW20200910",
                    "status": 0,
                    "delay": 2
                 },
                 {
                    "title": "21TCE20200910",
                    "subTitle1": "INSERT CORE",
                    "subTitle2": "P20200910-001",
                    "subTitle3": "DRAW20200912",
                    "status": 1,
                    "delay": 1
                 }
               ]
    
},
{
    "machine": "MC2",
    "work"   : [
                 {
                    "title": "21TCE20200911",
                    "subTitle1": "SCREW",
                    "subTitle2": "P20200910-001",
                    "subTitle3": "DRAW20200910",
                    "status": 1,
                    "delay": 2
                 }
               ]
    
},
{
    "machine": "MC3",
    "work"   : [
                 {
                    "title": "21TCE20200913",
                    "subTitle1": "INSERT FIX",
                    "subTitle2": "P20200910-001",
                    "subTitle3": "DRAW20200910",
                    "status": 0,
                    "delay": 1
                 }
               ]
    
}

]

Actualmente solo puedo devolver json normal para cada registro, pero quiero agrupar y devolver json anidado como se indicó anteriormente.

estos a continuación son mis códigos model.py

    desde modelos de importación django.db
    clase MachineSchedule (modelos.Modelo):
        machine = models.CharField (longitud_máxima = 255)
        title = modelos.CharField (max_length = 255)
        subTitle1 = models.CharField (max_length = 255)
        subTitle2 = models.CharField (max_length = 255)
        subTitle3 = models.CharField (max_length = 255)
        status = modelos.IntegerField (1)
        delay = models.IntegerField (1)

views.py

    de django.shortcuts import render
    de rest_framework importar genéricos
    desde .models import MachineSchedule
    desde .serializers importar MachineScheduleSerializer
    clase MachineScheduleListAPIView (generics.ListCreateAPIView):
        serializer_class = MachineScheduleSerializer
          model = MachineSchedule
            fields = '__all__'

serializers.py

    desde serializadores de importación rest_framework
    desde .models import MachineAllocate
    
    clase MachineAllocateSerializer (serializers.ModelSerializer):
        clase Meta:
            model = MachineAllocate
            fields = '__all__'

Respuestas

1 SuryaPratapRana Sep 12 2020 at 18:22
#models
class Work(models.Model):
title   = models.CharField(max_length=255)
subTitle1 = models.CharField(max_length=255)
subTitle2 = models.CharField(max_length=255)
subTitle3 = models.CharField(max_length=255)
status = models.IntegerField(1)
delay = models.IntegerField(1)

class MachineSchedule(models.Model):
machine = models.CharField(max_length=255)
work = models.ForeignKey(Work, on_delete=models.CASCADE, related_name='work')

#serializer
from rest_framework import serializers
from .models import *

class WorkSerializer(serializers.ModelSerializer):
class Meta:
    model = MachineAllo
    fields = '__all__'

class MachineScheduleSerializer(serializers.ModelSerializer):
work = WorkSerializer(many=True)
class Meta:
    model = MachineAllo
    fields = '__all__'

#views
from rest_framework import generics
from .models import MachineSchedule
from .serializers import MachineScheduleSerializer

class MachineScheduleListAPIView(generics.ListCreateAPIView):
serializer_class = MachineScheduleSerializer
model = MachineSchedule
fields = '__all__'