Django annotate based on another annotate create a duplicate query
Я хочу вычислить количество членов группы (no_members), сумму баллов членов группы (point) и средний балл на человека (avg_point) для каждой группы с аннотацией:
groups = StudyGroup.objects.filter(group_filter).select_related('parent').annotate(
no_members=Count('student', distinct=True),
point=Sum('student__point__point', filter=point_filter),
avg_point=ExpressionWrapper(F('point') / F('no_members'), output_field=FloatField()))
но когда я проверяю запрос (groups.query) в avg_point
вместо использования point/no_members
запрос становится SUM(study_league_point.point) / COUNT(DISTINCT users_student.user_id)
(точка и no_members вычисляются снова). запрос становится:
SELECT
`study_league_studygroup`.`id`,
`study_league_studygroup`.`name`,
`study_league_studygroup`.`parent_id`,
COUNT(DISTINCT `users_student`.`user_id`) AS `no_members`,
SUM(`study_league_point`.`point`) AS `point`,
(
SUM(`study_league_point`.`point`) / COUNT(DISTINCT `users_student`.`user_id`)
) AS `avg_point`,
`layers_layer`.`id`,
`layers_layer`.`name`,
`layers_layer`.`type_id`,
`layers_layer`.`parent_id`,
`layers_layer`.`created`,
`layers_layer`.`default`,
`layers_layer`.`lft`,
`layers_layer`.`rght`,
`layers_layer`.`tree_id`,
`layers_layer`.`level`
FROM
`study_league_studygroup`
LEFT OUTER JOIN `users_student` ON (
`study_league_studygroup`.`id` = `users_student`.`study_group_id`
)
LEFT OUTER JOIN `study_league_point` ON (
`users_student`.`user_id` = `study_league_point`.`student_id`
)
INNER JOIN `layers_layer` ON (
`study_league_studygroup`.`parent_id` = `layers_layer`.`id`
)
GROUP BY
`study_league_studygroup`.`id`
но я хочу использовать (point / no_members) AS avg_point
вместо (SUM(study_league_point.point) / COUNT(DISTINCT users_student.user_id)) AS avg_point