Django группировка результатов с помощью GROUP BY

08 Сен 2017 , 867

Иногда при работе с базами данных нам приходится группировать результаты. Допустим ,  нам нужно подсчитать количество изображений для каждого товара или вычислить сумму для всех товаров или найти максимальную зарплату. Все это делается с помощью агрегатных функций и конструкции 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.

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги