相关疑难解决方法(0)

Django中DateTime字段之间的聚合差异

我有一个表,其中包含一系列与时间段相关的条目(具体来说,是为客户工作的时间):

task_time:
id     |    start_time    |    end_time       |    client (fk)
1        08/12/2011 14:48   08/12/2011 14:50     2
Run Code Online (Sandbox Code Playgroud)

我试图从我的Django应用程序聚合给定客户端的所有工作时间:

time_worked_aggregate = models.TaskTime.objects.\
                        filter(client = some_client_id).\
                        extra(select = {'elapsed': 'SUM(task_time.end_time - task_time.start_time)'}).\
                        values('elapsed')

if len(time_worked_aggregate) > 0:
    time_worked = time_worked_aggregate[0]['elapsed'].total_seconds()
else:
    time_worked = 0
Run Code Online (Sandbox Code Playgroud)

这似乎不优雅,但确实有效.或者至少我认为:事实证明它在PostgreSQL数据库上工作正常,但当我转移到SQLite时,一切都会消失.

一点挖掘表明,其原因是DateTimes不是SQLite中的一流数据.以下原始SQLite查询将完成我的工作:

SELECT SUM(strftime('%s', end_time) - strftime('%s', start_time)) FROM task_time WHERE ...;
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 上面的Python示例似乎很迂回.我们能更优雅地做到这一点吗?
  • 更重要的是,在这个阶段,我们能否以一种适用于Postgres和SQLite的方式实现?理想情况下,我不想编写原始SQL查询并切换恰好存在的数据库后端; 在一般的,Django是在保护我们从这个非常好.Django对此操作有合理的抽象吗?如果没有,对我来说在后端进行条件切换有什么明智的方法?

我应该提一下,数据集是数千个条目; 以下不太实际:

sum([task_time.end_date - task_time.start_date for task_time in models.TaskTime.objects.filter(...)])
Run Code Online (Sandbox Code Playgroud)

sqlite django postgresql orm aggregate

8
推荐指数
2
解决办法
4736
查看次数

标签 统计

aggregate ×1

django ×1

orm ×1

postgresql ×1

sqlite ×1