Django自定义聚合
我正在建立一个网站,目的是为了提供指导服务。在这个网站上,导师们会记录他们和学员的会议情况。这些记录会显示在一个仪表盘上,我会处理并展示所需的数据。
问题是:我需要找出这些记录的平均频率,也就是在一组指导关系中,记录出现的平均次数。
我的方法是:
第一步:计算平均频率,也就是每个指导关系中,两个相邻记录之间的时间差的平均值。
第二步:计算第一步中每个指导关系的平均频率的平均值。
我知道我需要先把记录按指导关系分组,然后再传递给一个自定义的聚合函数来完成第一步和第二步。请问我该如何在Django中实现这个?有没有人能帮我解决这个问题?非常感谢!
1 个回答
0
首先,你需要知道在哪里进行计算。其实有两个地方可以选择,每个地方都有优缺点。
第一个地方是数据库层。不过,遗憾的是,Django没有提供直接写查询的函数。所以你需要使用原始查询。另外,你还需要一个支持分析的数据库管理系统:
sql = """
with table_with_predates as (
SELECT Id,
some_date,
lag(some_date) pre_date
FROM menthors
WINDOW client_window as (partition by client order by idMenthor)
) select Id, avg( some_date - pre_date) as data_average
from table_with_predates
group by Id
"""
menthors = Menthor.objects.raw( sql )
print ( 'Menthor average', menthors[0].name, menthors[0].data_average )
第二步可以通过自定义SQL来完成。从这个点出发,推断起来很简单。
第二个地方是应用层。你可以从模型中获取日志时间,然后用Python计算平均值:
log_times = ( Log
.objects
.filter( menthor = some_menthor )
.values_list('some_date', flat=True)
)
menthor_average_log = reduce(lambda x, y: x + y, log_times) / len(log_times)
现在你有了开始编写代码的材料。祝你好运。