繁体   English   中英

prefetch_related 作为对象列表

[英]prefetch_related as list of objects

我不知道如何将 MeasurememtResult 表中的所有 refetch_related 对象合并到一个列表对象中:

模型.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)

视图.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()

序列化程序.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() `

所以,我得到的响应如下:

[
    {
        "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"
    }
]

但我应该返回 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"
            }
        ]
    }

预取相关用于数据库查询优化。 它与您的响应结构无关。

要返回具有不同设备 ID 的查询集,

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

请注意,distinct("fieldname") 仅在您使用 postgres 数据库时才有效。请研究如何让它在您的数据库中工作。 Select DISTINCT django 中的各个列?

然后在您的序列化程序中:

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

您可以使用所需的字段对其进行编辑,在字段数组中,您可以提供如下字段:

 fields = ["measurement_result", "measurement_type"]

暂无
暂无

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

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