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))