我不知道如何将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"
}
]
}
预取相关的是用于数据库查询优化。 它与你的响应结构无关。
要返回具有不同设备id的queryset,
queryset = DeviceMeasurement.objects.values('patient__first_name', 'device__id', 'created_date', 'front_id',
'results__measurement_result',
'results__measurement_type').distinct("device").prefetch_related('res_data').all()
请注意,distinct(“fieldname”)只有在使用postgres数据库时才会工作。请研究如何让它在您的数据库中工作。
然后在序列化程序中:
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"]