Как сделать запрос в Django, который возвращает из БД(mysql) статистику продаж с разбивкой по периодам?


Есть действующая БД(mysql), в которую собирается информация о продажах с торговых точек - одна запись - одна операция с какой-либо точки.
В таблице shops хранятся id(AUTO_INCREMENT int(11)), name(varchar(50)) и т.д (пока не интересуют) торговых точек.
В таблице sales интересующие поля - shop(varchar(3)), date_oper(datatime), summ_oper(decimal(10,2)).

Я хочу написать страницу статистики продаж в виде:

введите сюда описание изображения

Обращаю внимание, что у 11 и 12 точке продаж в этом году не было.

Все эти данные я могу получить одним SQL запросом:


    select s.shop, sh.name, ts.today_summ, sum(s.summ_oper) as month_summ, ys.year_summ
    from sales s

    left join shops sh        # Вывожу только те магазины, в которых были продажи в этом году
    on s.shop = sh.id

    left join
    (select shop as sh1, sum(summ_oper) as year_summ
    from sales
    where year(data_oper) = year(curdate())
    group by shop
    order by CONVERT(shop, SIGNED INTEGER)) as ys on s.shop = ys.sh1    # Привожу к int для правильной сортировки

    left join
    (select shop as sh2, sum(summ_oper) as today_summ
    from sales
    where data_oper >= curdate()
    group by shop
    order by CONVERT(shop, SIGNED INTEGER)) as ts on s.shop = ts.sh2

    where year(data_oper) = year(curdate()) and month(data_oper) = month(curdate())
    group by shop
    order by CONVERT(shop, SIGNED INTEGER)
    ;

Подскажите, как мне получить эти данные с помощью Django-ORM для передачи в HTML шаблон?

Модели (создались через inspectdb) следующие:


class Shops(models.Model):
    name = models.CharField(max_length=50)
    short_name = models.CharField(max_length=20)
    city = models.CharField(max_length=50)

    def __str__(self):
        return str(self.name)

    class Meta:
        managed = False
        db_table = 'shops'



class Sales(models.Model):
    data_oper = models.DateTimeField()
    summ_oper = models.DecimalField(max_digits=10, decimal_places=2)
    shop = models.CharField(max_length=3)

    def __str__(self):
        return str(self.id)

    class Meta:
        managed = False
        db_table = 'sales'
        ordering = ('id',)


HTML шаблон такой:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>Статистика по выручке</h3>
    <table width="50%" cellspacing="0" border="1">
    <tr><th>Магазин</th><th>Сегодня</th><th>Этот месяц</th><th>Этот год</th></tr>
    {% for r in result %}
        <tr><td>{{ r.name }}</td><td>{{ r.today_summ }}</td><td>{{ r.month_summ }}</td><td>{{ r.year_summ }}</td></tr>
    {% endfor %}
    </table>
</body>
</html>


Ответы (0 шт):