POST id объектов и извлечение связанных с ним вложенных таблиц

Может ли кто-нибудь посоветовать мне, как поступить с получением данных, таких как в этом примере JSON:

[
    {       
            "deviceid": 4,
            "devicename": "###", 
            "device_measurment": {
                    "deviceid": 4,
                    "measurement": "31.8",
                 }   
    },
 ]
    
How is it right now:

 [
    {       
            "deviceid": 4,
            "devicename": "###",     
    },
    {
       
            "deviceid": 4,
            "measurement": "31.8",
    },
 ]

Я понимаю проблему и почему я получаю такой ответ, но я не могу решить эту проблему через сериализатор. на данный момент у меня следующее

Views из itertools import chain

class RetrieveSpecificDevicesView(APIView):
  permission_classes = [permissions.IsAuthenticated]
  serializer_class = SpecificDeviceSerializer
  
  def get_object(self, queryset=None):
        obj = self.request.data
        return obj

  def post(self, request):
    if self.request.method == 'POST': 
       self.object = self.get_object()
       serializer = SpecificDeviceSerializer(data=request.data)

       if not serializer.is_valid():
          return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

       if serializer.is_valid():
          obj1= Devices.objects.using('yelcloud').filter(deviceid=serializer.data.get("deviceid"))
          obj2= Measurements.objects.using('yelcloud').filter(deviceid=serializer.data.get("deviceid"))
          dats= chain(obj1, obj2)
          if Devices.objects.using('yelcloud').filter(deviceid=serializer.data.get("deviceid")).exists():
            data = serializers.serialize('json', dats)
           
            return HttpResponse(data, content_type="application/json")

       return JsonResponse(serializer.erorr, status=status.HTTP_201_CREATED) 
<
    class SpecificDeviceSerializer(serializers.Serializer):
      deviceid = serializers.CharField(required=True)


class MeasurmentsSerializer(serializers.ModelSerializer):
   
    class Meta:
      model = Measurements
      fields = ('measurementid','measurement')

Модели

введите описание изображения здесь

Решение: Сериализатор

class SpecificDeviceSerializer(serializers.ModelSerializer):
  measurments = serializers.SerializerMethodField()
  
  def get_measurments(self, obj):
       device_measurements = obj.measurment_details.last()  
       serializer = MeasurmentsSerializer(device_measurements)
       return serializer.data


  class Meta:
      model = Devices
      fields = ('devicename','measurments')

Виды

class RetrieveSpecificDevicesView(viewsets.ModelViewSet):
      permission_classes = [permissions.IsAuthenticated]
      serializer_class = SpecificDeviceSerializer
      
      def get_queryset(self):  
          return Devices.objects.using('yelcloud').filter(deviceid=self.request.data.get("deviceid"))

JSON:

[
    {
        "devicename": "RTMU 3068",
        "measurments": {
            "measurementid": 2980465,
            "measurement": "25.6"
        }
    }
]

Документация: Лучший для этого случая

Вернуться на верх