8 сентября 2017 г. 13:43

172

Django GROUP BY

Как реализовать 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"

comments powered by Disqus