簡體   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