Django orm limit before annotation
Я хочу ограничить набор запросов перед аннотацией! Вот мой код django orm :
ProductDB.objects.prefetch_related('media').select_related("cover", 'category').filter(**variants_filter)[offset:offset + limit].annotate(
variants_count=Count('product_variants'))
вот запрос, который генерирует django:
SELECT "shop_product"."id",
"shop_product"."is_deleted",
"shop_product"."created_at",
"shop_product"."updated_at",
"shop_product"."approval_status",
"shop_product"."name",
"shop_product"."name_en",
"shop_product"."slug",
"shop_product"."source_name",
"shop_product"."source_id",
"shop_product"."default_variant_id",
"shop_product"."phone_id",
"shop_product"."phone_model_id",
"shop_product"."category_id",
"shop_product"."brand_id",
"shop_product"."source_price",
"shop_product"."cover_id",
"shop_product"."attributes",
"shop_product"."extra_data",
COUNT(T3."id") AS "variants_count",
"shop_category"."id",
"shop_category"."is_deleted",
"shop_category"."created_at",
"shop_category"."updated_at",
"shop_category"."name",
"shop_category"."name_en",
"shop_category"."slug",
"shop_category"."order",
"shop_category"."parent_id",
"account_file"."id",
"account_file"."is_deleted",
"account_file"."created_at",
"account_file"."updated_at",
"account_file"."file",
"account_file"."normal",
"account_file"."thumbnail",
"account_file"."name",
"account_file"."type",
"account_file"."user_id",
"account_file"."source"
FROM "shop_product"
LEFT OUTER JOIN "shop_variant" T3 ON ("shop_product"."id" = T3."product_id")
LEFT OUTER JOIN "shop_category" ON ("shop_product"."category_id" = "shop_category"."id")
LEFT OUTER JOIN "account_file" ON ("shop_product"."cover_id" = "account_file"."id")
WHERE "shop_product"."default_variant_id" IS NOT NULL
GROUP BY "shop_product"."id",
"shop_category"."id", "account_file"."id"
LIMIT 5
Django ставит лимит после всех селектов и это очень медленно:
Если я помещаю limit на select, он работает очень быстро:
Просто заменив (select * from "shop_product" limit 5)
вместо FROM "shop_product"
Я делаю это неправильно? Как я могу реализовать это с помощью orm