Вложенные модели в сериализаторе django

Я не могу получить последнее измерение для каждого устройства на основе ID устройства из измерения. Если кто-нибудь может подсказать мне, как это реализовать?

Модели

class Devices(models.Model):
                        deviceid = models.AutoField(db_column='deviceId', primary_key=True)  # Field name made lowercase.
                        devicename = models.CharField(db_column='deviceName', unique=True, max_length=128)  # Field name made lowercase
                        devicestatus = models.IntegerField(db_column='deviceStatus')  # Field name made lowercase.
                    
                        Class Meta:
                            managed = False
                            db_table = 'devices'
                    
class Measurements(models.Model):
                        measurementid = models.AutoField(db_column='measurementId', primary_key=True)  # Field name made lowercase.
                        deviceid = models.ForeignKey(Devices,   models.DO_NOTHING, related_name="measurment_details", db_column='deviceId')  # Field name made lowercase.
                        measurement = models.CharField(max_length=64, blank=True, null=True)
                        
                    
                        class Meta:
                            managed = False
                            get_latest_by = 'measurementtime'
                            db_table = 'measurements'

Сериализатор

class MeasurmentsSerializer(serializers.ModelSerializer):
    class Meta:
      model = Measurements
      fields = ('measurementid','measurement')
   
class DeviceSerializer(serializers.ModelSerializer):
  latestmeasurment = serializers.SerializerMethodField()
  count = 0 
 
  
  def get_latestmeasurment(self, obj):
       qs = Measurements.objects.using('@@@').last()
       serializer = MeasurmentsSerializer(instance=qs, many=False)
       self.count = 1 + self.count
       print(self.count , serializer.data )
       return serializer.data
 
  class Meta:
    model = Devices
    fields = ("devicename", 'latestmeasurment')

Виды

class RetrieveAllDevicesView(viewsets.ModelViewSet):
  http_method_names = ['get']
  permission_classes = [permissions.IsAuthenticated]
  serializer_class = DeviceSerializer
  queryset = Devices.objects.using('@@@')

В сериализаторе можно увидеть счетчик для примитива отладки:

1 {'measurementid': 2942080, 'measurement': '35.0'}
2 {'measurementid': 2942080, 'measurement': '35.0'}
3 {'measurementid': 2942080, 'measurement': '35.0'}
4 {'measurementid': 2942080, 'measurement': '35.0'}
5 {'measurementid': 2942080, 'measurement': '35.0'}
6 {'measurementid': 2942080, 'measurement': '35.0'}
7 {'measurementid': 2942080, 'measurement': '35.0'}
8 {'measurementid': 2942080, 'measurement': '35.0'}
9 {'measurementid': 2942080, 'measurement': '35.0'}
10 {'measurementid': 2942080, 'measurement': '35.0'}

Ответ в JSON из представления:

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

def get_latestmeasurment(self, obj):
    device_measurements = obj.measurment_details.all()
    last_measurement = device_measurements.order_by('id').last()
    serializer = MeasurmentsSerializer(last_measurement)
    return serializer.data

вы получите все измерения для каждого устройства и после сортировки получите последнее измерение как last_measurment

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