简体   繁体   English

prefetch_related 作为对象列表

[英]prefetch_related as list of objects

I don't know how to merge all refetch_related objects from MeasurememtResult table to one list objects:我不知道如何将 MeasurememtResult 表中的所有 refetch_related 对象合并到一个列表对象中:

models.py模型.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视图.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序列化程序.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.但我应该返回 MeasurememtResult 对象列表,例如: 在 2 个对象中,我的 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,要返回具有不同设备 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.请注意,distinct("fieldname") 仅在您使用 postgres 数据库时才有效。请研究如何让它在您的数据库中工作。 Select DISTINCT individual columns in django? Select DISTINCT 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"]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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