【发布时间】:2012-01-16 00:05:30
【问题描述】:
我有一个表格,其中包含一系列与时间段相关的条目(特别是为客户工作的时间):
task_time:
id | start_time | end_time | client (fk)
1 08/12/2011 14:48 08/12/2011 14:50 2
我正在尝试从我的 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
这看起来不优雅,但它确实有效。或者至少我是这么想的:事实证明它在 PostgreSQL 数据库上运行良好,但是当我转移到 SQLite 时,一切都死了。
一点挖掘表明,这样做的原因是DateTimes 不是 SQLite 中的一流数据。以下原始 SQLite 查询将完成我的工作:
SELECT SUM(strftime('%s', end_time) - strftime('%s', start_time)) FROM task_time WHERE ...;
我的问题如下:
- 上面的 Python 示例似乎是迂回的。我们可以更优雅地做到这一点吗?
- 更重要的是,在这个阶段,我们能否以一种既适用于 Postgres 又适用于 SQLite 的方式进行操作?理想情况下,我不想编写原始 SQL 查询并打开恰好到位的数据库后端;在一般中,Django 非常擅长保护我们免受这种情况的影响。 Django 对这个操作有合理的抽象吗?如果没有,我在后端进行条件切换的明智方法是什么?
我应该提到上下文,数据集有数千个条目;以下内容并不实际:
sum([task_time.end_date - task_time.start_date for task_time in models.TaskTime.objects.filter(...)])
【问题讨论】:
标签: django sqlite postgresql orm aggregate