Django группировка результатов с помощью GROUP BY
Иногда при работе с базами данных нам приходится группировать результаты. Допустим , нам нужно подсчитать количество изображений для каждого товара или вычислить сумму для всех товаров или найти максимальную зарплату. Все это делается с помощью агрегатных функций и конструкции GROUP BY. В данной статье рассмотрим , как с помощью Django ORM писать код, который на выходе генерирует SQL код с использованием GROUP BY и агрегатных функций.
Допустим у нас есть таблица товаров Product и таблица изображений этих товаров ProductImage.
Нужно подсчитать сколько изображений есть у каждого продукта.
Для начала напишем SQL запрос , который решает данную проблему. Используем GROUP BY вместе LEFT OUTER JOIN
SELECT product.id,
COUNT(productimage.id) AS images__count
FROM shop_product as product LEFT OUTER JOIN
shop_productimage as productimage ON (product.id = productimage.product_id)
GROUP BY product.id
ORDER BY images__count DESC
А теперь используя Django ORM мы напишем следующий код , который решает данную задачу
from django.db.models import Count
from shop.models import Product
qs = Product.objects.values('id').annotate(Count('images')).order_by('-images__count')
print(qs)
print(qs.query)
Посмотрим какой sql запрос генерирует данный код.
Как мы можем заметить на скриншоте сгенированный sql запрос похож на то , который мы описивали выше.
Заключение
В данной статье мы рассмотрели агрегатные функции вместе с Group BY.