Многоуровневая группировка и агрегация в Джанго - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть модель, которая выглядит следующим образом:

class Price(models.Model):
    book = models.ForeignKey(Book)
    date = models.Dateield(auto_now_add=True)
    publisher = models.ForeignKey(Publisher)
    price = models.PositiveSmallIntegerField()

Не существует уникальных ограничений на несколько столбцов, каждая книга может иметь несколько цен в день для одного и того же издателя.

IЯ хотел бы сгруппировать все цены, но сначала я бы хотел сгруппировать все цены (средние) для конкретного издателя за определенный день.Это фактически вернет уникальную запись о дате, издателе и книге.

Тогда я бы хотел сгруппировать все цены (суммы) для конкретной книги за определенный день.

ВотSQL Я бы написал:

SELECT book_id
     , DATE(date) as date
     , SUM(price) AS price
  FROM
     ( SELECT book_id
            , DATE(date) as date
            , AVG(price) AS price
            , publisher_id
         FROM literature_prices
        GROUP
           BY date
            , book_id
            , publisher_id
     )
 GROUP
    BY book_id
     , date 

Это было легко сделать в SQL, но я не уверен, как бы я поступил так же, используя Djano ORM.Любая помощь?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2012

Вы также можете использовать свой SQL-запрос как представление и создать модель Django вокруг этого представления.

Подробные объяснения можно найти здесь: http://anthony -tresontani.github.com / Django /2012/09/12 / WKA-Джанго-ОРМ-ограничение /

0 голосов
/ 23 февраля 2012

API агрегации в Django хорошо документирован здесь:

https://docs.djangoproject.com/en/dev/topics/db/aggregation/

Пример агрегирования по издателю в вашем примере будет.

 query_set = Price.objects.extra(select={'count': 'count(1)'}, 
                           order_by=['-count']).values('count', 'publisher')

 query_set.query.group_by = ['publisher']

Длямногоуровневый.Я думаю, что вы можете продолжать вызывать функции aggregate () и group_by для объекта query_set.

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