2009-06-01 7 views
2

Просто интересно, если это возможно, чтобы получить результат, который я могу получить с помощью этого 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 (выберите = {}) и .values ​​(), а также с помощью .query.group_by трюк, описанный here, но по достоинству оценят свежие глаза на проблему.

ответ

3

Джанго 1,1 (ствол в момент регистрации этого) имеет aggregates, они позволяют выполнять counts, mins, sums, averages и т.д. в запросах.

То, что вы хотите сделать, возможно, будет выполнено с использованием нескольких запросов. Помните, что каждая строка в таблице (даже сгенерированная таблица результатов) должна быть новым объектом. Вы на самом деле не объяснить, что вы суммируя, поэтому я буду считать это 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)) 
+0

Опять же, я хорошо знаю возможности агрегации, которые Django имеет в последней версии. Не могли бы вы попытаться создать такой запрос, который делает то, что предоставил ядро ​​SQL? :) –

2

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

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

+0

Да, я хорошо знаю, что я могу сделать необработанный SQL, вопрос в том, могу ли я сделать это с помощью текущих возможностей ORM. –

+0

Мне бы хотелось узнать иначе, но я думаю, что ответ на данный момент «Нет». –

 Смежные вопросы

  • Нет связанных вопросов^_^