【问题标题】:prefetch_related as list of objectsprefetch_related 作为对象列表
【发布时间】:2020-10-19 18:16:52
【问题描述】:

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

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()

序列化器.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"
            }
        ]
    }

【问题讨论】:

  • 请发布您的 serailizer GetMeasurementsSerializer
  • 请编辑问题..不要在 cmets 中邮政编码

标签: python django django-rest-framework orm


【解决方案1】:

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

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

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

请注意, distinct("fieldname") 仅在您使用 postgres 数据库时才有效。请研究如何使其在您的数据库中工作。 Select DISTINCT individual columns in 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"]

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 2016-08-30
    • 2018-03-10
    • 2018-06-15
    • 2019-11-25
    • 2018-05-24
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多