简体   繁体   中英

prefetch_related as list of objects

I don't know how to merge all refetch_related objects from MeasurememtResult table to one list objects:

models.py

class DeviceMeasurement(models.Model):
    patient = models.ForeignKey(Patient, blank=True, null=True, on_delete=models.CASCADE)
    device = models.ForeignKey(Device, on_delete=models.CASCADE)
    created_date = models.DateTimeField()
    front_id = models.UUIDField(blank=True, null=True)


class MeasurememtResult(models.Model):
    measurement_result = models.FloatField()
    measurement_type = models.CharField(choices=MEASUREMENT_TYPES, max_length=30)
    device_measurement_id = models.ForeignKey(DeviceMeasurement, related_name='res_data', on_delete=models.CASCADE)

views.py

class GetMeasurements(viewsets.GenericViewSet, mixins.ListModelMixin):
    permission_classes = (IsAuthenticated,)
    serializer_class = GetMeasurementsSerializer
    queryset = DeviceMeasurement.objects.values('patient__first_name', 'device__id', 'created_date', 'front_id',
                                                'results__measurement_result',
                                                'results__measurement_type').prefetch_related('res_data').all()

serializers.py

class GetMeasurementsSerializer(serializers.Serializer):
    created_date = serializers.DateTimeField()
    front_id = serializers.UUIDField()
    patient__first_name = serializers.CharField()
    device__id = serializers.IntegerField()
    results__measurement_result =  serializers.IntegerField()
    results__measurement_type = serializers.CharField() `

So, I got Response like as:

[
    {
        "created_date": "2020-06-05T15:03:22.481032+03:00",
        "front_id": null,
        "patient__first_name": "Alex",
        "device__id": 8,
        "results__measurement_result": 100,
        "results__measurement_type": "blood_pressure_SYS"
    },
    {
        "created_date": "2020-06-05T15:03:22.481032+03:00",
        "front_id": null,
        "patient__first_name": "Alex",
        "device__id": 8,
        "results__measurement_result": 120,
        "results__measurement_type": "blood_pressure_DIA"
    }
]

But I should return list of MeasurememtResult objects like as: In 2 objects i have equal values of device_id.

    {
        "created_date": "2020-06-05T15:03:22.481032+03:00",
        "front_id": null,
        "patient__first_name": "Alex",
        "device__id": 8,
        "res_data": [
            {
                "results__measurement_result": 120,
                "results__measurement_type": "blood_pressure_DIA"
            },
            {
                "results__measurement_result": 100,
                "results__measurement_type": "blood_pressure_SYS"
            }
        ]
    }

Prefetch related is for database query optimization. It has no relation with how your response is structured.

To return queryset with distinct device id,

 queryset = DeviceMeasurement.objects.all().distinct("device").prefetch_related('res_data')

Note that the distinct("fieldname") will only work if you using postgres database.Please research on how to get it working in your database. Select DISTINCT individual columns in django?

Then in your serializer:

class MeasurementResultSerializer(serializers.ModelSerializer):
     class Meta:
         model = MeasurememtResult
         fields = "__all__"
         read_only_fields = fields

class GetMeasurementsSerializer(serializers.Serializer):
        res_data = serializers.SerializerMethodField()
        created_date = serializers.DateTimeField()
        front_id = serializers.UUIDField()
        patient__first_name = serializers.CharField()
        device__id = serializers.IntegerField()
       
        def get_res_data(self, instance):
            return MeasurementResultSerializer(instance.res_data.all(), many=True).data

You can edit this with your required fields, Inside fields array you can give fields like:

 fields = ["measurement_result", "measurement_type"]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM