Как работает set_group_by в Django?
Я писал следующий запрос:
claim_query = ClaimBillSum.objects.filter(claim__lob__in = lobObj)\
.annotate(claim_count = Count("claim__claim_id", distinct=True))\
.annotate(claim_bill_sum = Sum("bill_sum"))\
.values("claim__body_part", "claim_count", "claim_bill_sum")\
.order_by("claim__body_part")
Когда я проверил свойство запроса, он группировался по всем свойствам таблиц, связанных в этом запросе, а не только по тем, которые были выбраны в функции values(), когда я хотел группироваться только по claim__body_part.
Пока я искал способ изменить инструкцию group by, я нашел функцию query.set_group_by(), которая, будучи примененной, исправила запрос так, как я хотел:
claim_query.query.set_group_by()
SELECT
"CLAIM"."body_part",
COUNT(DISTINCT "claim_bill_sum"."claim_id") AS "claim_count",
SUM("claim_bill_sum"."bill_sum") AS "claim_bill_sum"
FROM
"claim_bill_sum"
INNER JOIN "CLAIM" ON
("claim_bill_sum"."claim_id" = "CLAIM"."claim_id")
WHERE
"CLAIM"."lob_id" IN (SELECT U0."lob_id" FROM "LOB" U0 WHERE U0."client_id" = 1)
GROUP BY
"CLAIM"."body_part"
ORDER BY
"CLAIM"."body_part" ASC
Но я не смог найти никакой информации в документации Django или где-либо еще, чтобы лучше описать, как работает эта функция. Почему группа по умолчанию выбирает все свойства, и как работает .set_group_by(), выбирая именно то свойство, которое я хотел?