Django自定义聚合

1 投票
1 回答
661 浏览
提问于 2025-04-19 12:45

我正在建立一个网站,目的是为了提供指导服务。在这个网站上,导师们会记录他们和学员的会议情况。这些记录会显示在一个仪表盘上,我会处理并展示所需的数据。

问题是:我需要找出这些记录的平均频率,也就是在一组指导关系中,记录出现的平均次数。

我的方法是:

第一步:计算平均频率,也就是每个指导关系中,两个相邻记录之间的时间差的平均值。

第二步:计算第一步中每个指导关系的平均频率的平均值。

我知道我需要先把记录按指导关系分组,然后再传递给一个自定义的聚合函数来完成第一步和第二步。请问我该如何在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)

现在你有了开始编写代码的材料。祝你好运。

撰写回答