Джанго - получить разные даты из отметки времени - PullRequest
8 голосов
/ 22 декабря 2011

Я пытаюсь отфильтровать пользователей по дате, но не могу, пока не найду первую и последнюю дату пользователей в БД. Хотя мой скрипт может отфильтровать дубликаты позже, я хочу сделать это с самого начала, используя 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 вместе с кратким объяснением того, что я хочу:

 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-запроса вручную и повторение.

Ответы [ 2 ]

7 голосов
/ 22 декабря 2011

При создании отчетов для больших наборов данных 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')
0 голосов
/ 22 декабря 2011

Я проголосовал за то, чтобы закрыть это, потому что это дубликат этого вопроса , поэтому вот ответ, если вы не хотите переходить по ссылке, любезно предоставлено nosklo .


Создайте небольшую функцию для извлечения только даты: def extract_date (entity): извлекает начальную дату из сущности вернуть 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))
...