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