Джанго - вопрос ОРМ - PullRequest
2 голосов
/ 01 июня 2009

Просто интересно, возможно ли получить результат, который я могу получить, используя этот SQL-запрос только с Django ORM:

SELECT * FROM (SELECT DATE_FORMAT(created, "%Y") as dte, sum(1) FROM some_table GROUP BY dte) as analytics;

Результат:

+------+--------+
| dte  | sum(1) |
+------+--------+
| 2006 |     20 | 
| 2007 |   2230 | 
| 2008 |   4929 | 
| 2009 |   1177 | 
+------+--------+

Упрощенная модель выглядит так:

# some/models.py

class Table(models.Model):
   created = models.DateTimeField(default=datetime.datetime.now)

Я пробовал различные способы, используя сочетание .extra (select = {}) и .values ​​(), а также используя трюк .query.group_by, описанный здесь , но был бы рад по-новому взглянуть на проблема.

Ответы [ 2 ]

3 голосов
/ 01 июня 2009

Django 1.1 (транк на момент публикации) имеет агрегатов , они позволяют выполнять подсчета , минут , сумм , в среднем и т. Д. В ваших запросах.

То, что вы хотите сделать, вероятно, будет выполнено с использованием нескольких наборов запросов. Помните, что каждая строка в таблице (даже сгенерированная таблица результатов) должна быть новым объектом. Вы действительно не объясняете, что вы суммируете, поэтому я рассмотрю это dollars:

book_years = Books.object.all().order_by('year').distinct()

# I use a list comprehension to filter out just the years
for year in [book_year.created.year for book_year in book_years]:
    sum_for_year = Book.objects.filter(created__year=year).aggregate(Sum(sales))
2 голосов
/ 01 июня 2009

Если вам нужен запрос, который Django не позволяет вам выразить через ORM, вы всегда можете использовать необработанный SQL .

Для вашей непосредственной цели я думаю, что группировка по выражению (и выполнение совокупного вычисления для группы) выходит за рамки текущих возможностей Django.

...