Django GROUP BY
08 Сен 2017 ,
253
Как реализовать GROUP BY средствами Django ORM
Проблема
Допустим у нас есть продукты Product и изображения ProductImage. Нужно подсчитать сколько изображений есть у каждого продукта.
Решение
С помощью SQL это делается просто с использованием GROUP BY , с использованием LEFT OUTER JOIN
SELECT "catalogue_product"."id", COUNT("catalogue_productimage"."id") AS "images__count"
FROM "catalogue_product"
LEFT OUTER JOIN "catalogue_productimage" ON ("catalogue_product"."id" = "catalogue_productimage"."product_id")
GROUP BY "catalogue_product"."id" ORDER BY "images__count" DESC
Используя Django ORM мы напишем следующий код
q = Product.objects.values('id').annotate(Count('images')).order_by('-images__count')
q = ProductImage.objects.values('product_id').annotate(count=Count('product_id'))
SELECT "catalogue_productimage"."product_id", COUNT("catalogue_productimage"."product_id") AS "count"
FROM "catalogue_productimage"
GROUP BY "catalogue_productimage"."product_id", "catalogue_productimage"."display_order"
ORDER BY "catalogue_productimage"."display_order" ASC
q=ProductImage.objects.values('product_id').\
annotate(dcount=Count('product_id')).filter(display_order=0,dcount__gt=1)
SELECT "catalogue_productimage"."product_id", COUNT("catalogue_productimage"."product_id") AS "dcount"
FROM "catalogue_productimage"
WHERE "catalogue_productimage"."display_order" = 0
GROUP BY "catalogue_productimage"."product_id", "catalogue_productimage"."display_order" HAVING COUNT("catalogue_productimage"."product_id") > 1
ORDER BY "catalogue_productimage"."display_order" ASC
q = ProductAttributeValue.objects.values('attribute_id').\
annotate(max_value=Max('value_float'),min_value=Min('value_float')).filter(value_float__isnull=False)
SELECT "catalogue_productattributevalue"."attribute_id",
MAX("catalogue_productattributevalue"."value_float") AS "max_value",
MIN("catalogue_productattributevalue"."value_float") AS "min_value"
FROM "catalogue_productattributevalue"
WHERE "catalogue_productattributevalue"."value_float" IS NOT NULL
GROUP BY "catalogue_productattributevalue"."attribute_id"