Как я могу сгруппировать по преобразованным значениям? - PullRequest
1 голос
/ 05 мая 2010

пока у меня есть этот запрос:

q = Foobar.objects.values('updater','updated')
q = q.annotate(update_count=Count("id"))

, который, кажется, генерирует запрос вроде:

select updater, updated, count(id)
from foobar
group by updater, updated

«обновлено» - это поле даты и времени, и я бы хотел подсчитать по дням с помощью запроса, который выглядит следующим образом:

select updater, cast(updated as date), count(id)
from foobar
group by updater, cast(updated as date)

Есть ли способ сделать это с помощью API Query, или я должен вернуться к сырому SQL?

Ответы [ 2 ]

0 голосов
/ 05 мая 2010

Django не поддерживает этот уровень контроля над запросами к базе данных - как правило, вы не можете выполнять запросы, используя такие функции, как CAST.

В этом случае у вас есть несколько вариантов. Прежде всего, проще всего, вы можете просто взять объект datetime, возвращенный объектом ORM, и удалить дополнительную точность, используя datetime.replace().

Другой вариант, если вы знаете, что никогда не захотите, чтобы ваше приложение Django использовало какую-либо точность в обновленном поле вне дня, - это просто определить updated в вашем models.py как models.DateField(), а не models.DateTimeField(). Это означает, что данные, возвращаемые моделью ORM, никогда не будут иметь точности сверх дня.

Наконец, я предполагаю, что вы используете самую последнюю версию Django (1.1), но в Django 1.2 (запланированной на 10 мая) вы сможете сделать следующее:

Foobar.objects.raw("select updater, cast(updated as date), count(id) from foobar group by updater, cast(updated as date)")

В результате (при условии, что столбцы и типы столбцов совпадают с тем, что вы определили в своей модели Foobar), будет обычный django ORM Queryset.

0 голосов
/ 05 мая 2010

QuerySet.dates () (http://docs.djangoproject.com/en/dev/ref/models/querysets/#dates-field-kind-order-asc) отводит вам часть пути туда, но, кажется, не очень хорошо с .values() и получается GROUP BY (я пробовал несколько минут).Возможно, вы уже видели это в любом случае ...

Но это действительно показывает, что Django уже имеет функцию SQL, которая вам понадобится, если вы напишите свою собственную версию SQL:

print(ProcessingState.objects.dates('timestamp', 'day').query)

приводит к

SELECT DISTINCT django_date_trunc("day", "databot_processingstate"."timestamp")
    FROM "databot_processingstate" ORDER BY 1 ASC

(извините за странные имена таблиц и прочее, это просто моя собственная модель, которую я хочу иметь под рукой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...