[英]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.