如何在Django序列化器中计算每日平均值并按日返回单条记录
实现每日心率记录平均值计算
1. 修改查询逻辑(视图层)
利用Django数据库聚合功能,按日期分组计算每日平均值:
from django.db.models.functions import TruncDate from django.db.models import Avg # 按日期分组,计算每日平均心率 records = Record.objects.filter(user=user, type="HeartRate") \ .annotate(date=TruncDate('date_time')) \ .values('date', 'type') \ .annotate(average_record=Avg('record')) \ .order_by('date')
TruncDate('date_time'):把date_time字段截断为纯日期格式(仅保留年/月/日),作为分组依据values('date', 'type'):指定按日期和记录类型分组,确保同一用户同类型的记录按日期聚合annotate(average_record=Avg('record')):计算每组(单日)的心率平均值order_by('date'):按日期对结果排序
2. 调整序列化器
因为返回的是聚合统计结果(而非原Record模型实例),需要定义对应序列化器:
class DailyAverageRecordSerializer(serializers.Serializer): type = serializers.CharField(max_length=9) date = serializers.DateField() average_record = serializers.DecimalField(decimal_places=4, max_digits=8)
3. 视图中使用新序列化器
替换原序列化器,处理聚合后的数据集:
serializer = DailyAverageRecordSerializer(records, many=True)
最终返回结果会按日期分组,每天仅一条记录,包含type、date(日期)和average_record(当日平均心率)三个字段。
内容的提问来源于stack exchange,提问作者Mohammad AlQudah
相关产品推荐
相关产品推荐

