【问题标题】:Django - get distinct dates from timestampDjango - 从时间戳中获取不同的日期
【发布时间】:2011-12-21 21:49:48
【问题描述】:

我正在尝试按日期过滤用户,但直到我在数据库中找到用户的第一个和最后一个日期才能过滤。虽然稍后我可以让我的脚本过滤掉 dups,但我想从一开始就使用 Django 的distinct 来完成它,因为它显着减少了。我试过了

User.objects.values('install_time').distinct().order_by()

但由于install_timetimestamp,它包括日期和时间(我并不真正关心)。因此,它过滤掉的唯一日期是我们可以检索多个用户安装日期的日期而不是时间

知道怎么做吗?我正在使用 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 查询和迭代更糟糕。

【问题讨论】:

  • @thatwasbrilliant 这正是我想要的;谢谢!有点奇怪,在 Google 上花了 2 小时却没有结果,在 SO 上只花了 30 分钟。
  • 你需要提高你的谷歌技能:)

标签: python django django-models


【解决方案1】:

在对较大的数据集进行报告时,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')

【讨论】:

【解决方案2】:

我投票决定关闭它,因为它是 this question 的重复,所以如果您不想访问该链接,这里是答案,由 nosklo 提供。


创建一个小函数来提取日期: def extract_date(实体): '从实体中提取开始日期' 返回 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))

【讨论】:

  • 提出您的问题仍然很有用,因为您在 30 分钟内搜索 google 时找不到答案。你应该接受这个答案并让它成为:) 下次有人使用你的语言搜索这个问题时,这个 Q 会出现在 google 上。
  • @YujiTomita 这就是我关闭而不是删除的原因。我仍然在 Google 上显示已关闭的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多