我正在尝试按日期过滤用户,但直到我可以找到数据库中用户的第一个和最后一个日期。虽然我可以让我的脚本稍后过滤掉重复,但我想从一开始就使用Django的distinct
来完成它,因为它会显着减少。我试过了
User.objects.values('install_time').distinct().order_by()
但由于install_time
是timestamp
,因此它包含日期和时间(我并不在乎)。因此,它过滤掉的唯一日期是我们可以检索多个用户的安装日期而不是的日期。
知道怎么做吗?我正在使用Django 1.3.1,Postgres 9.0.5和最新版本的psycopg2来运行它。
编辑:我忘了添加install_time
的数据类型:
install_time = models.DateTimeField()
编辑2:以下是Postgres shell的一些示例输出,以及我想要的快速解释:
2011-09-19 00:00:00
2011-09-11 00:00:00
2011-09-11 00:00:00 <--filtered out by distinct() (same date and time)
2011-10-13 06:38:37.576
2011-10-13 00:00:00 <--NOT filtered out by distinct() (same date but different time)
我知道Manager.raw
,但我宁愿用户django.db.connection.cursor
直接编写查询,因为Manager.raw
会返回RawQuerySet
,IMO比写{ SQL查询手动和迭代。
答案 0 :(得分:7)
对较大数据集itertools.group_by
执行报告时可能会太慢。在那些情况下,我让postgres处理分组:
truncate_date = connection.ops.date_trunc_sql('day','timestamp')
qs = qs.extra({'date':truncate_date})
return qs.values('date').annotate(Sum('amount')).order_by('date')
答案 1 :(得分:0)
我已经投票决定关闭这个,因为它是this question的副本,所以如果您不想访问此链接,请回答nosklo。
创建一个小函数来仅提取日期: def extract_date(实体): '从实体中提取开始日期' return entity.start_time.date()
然后您可以将其与itertools.groupby
:
from itertools import groupby
entities = Entity.objects.order_by('start_time')
for start_date, group in groupby(entities, key=extract_date):
do_something_with(start_date, list(group))