Django - получение отдельных дат из метки времени
Я пытаюсь фильтровать пользователей по дате, но не могу, пока не найду первую и последнюю дату пользователей в db. В то время как позже я могу отключить отлаживающие файлы script, я хочу сделать это с самого начала, используя Django distinct
, поскольку он значительно сокращается. Я попробовал
User.objects.values('install_time').distinct().order_by()
но поскольку install_time
является timestamp
, он включает дату и время (что мне действительно неинтересно). В результате единственными, которые он отфильтровывает, являются даты, где мы могли бы получить несколько установочных дат пользователей, но не раз.
Есть идеи, как это сделать? Я запускаю это с помощью Django 1.3.1, Postgres 9.0.5 и последней версии psycopg2.
EDIT: Я забыл добавить тип данных install_time
:
install_time = models.DateTimeField()
РЕДАКТИРОВАТЬ 2: Вот несколько примеров из оболочки Postgres, а также быстрое объяснение того, что я хочу:
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 вручную и итерация.
Ответы
Ответ 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
Я проголосовал за то, чтобы закрыть это, так как это дублирует этот вопрос, поэтому здесь ответ, если вы не хотите посещать ссылку, любезно предоставлен nosklo.
Создайте небольшую функцию для извлечения только даты: def extract_date (entity): 'извлекает дату начала из сущности' 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))