Почему выражение при аннотации переходит в group by в Django ORM
делаю запрос,
result = (clients
.values_list(Sum('summa') / kek)
)
Результат:
ProgrammingError: (1111, 'Invalid use of group function')
А сам sql выход такой:
SELECT
(
SUM( `crm_orderhistory`.`summa` ) / COUNT( DISTINCT `crm_orderhistory`.`order_date`, `crm_orderhistory`.`client_id` )) AS `combinedexpression1`
FROM
`crm_orderhistory`
WHERE
( `crm_orderhistory`.`order_date` >= "2022-01-18" AND `crm_orderhistory`.`order_date` <= "2023-01-20" )
GROUP BY
EXTRACT( MONTH FROM `crm_orderhistory`.`order_date` ),
COUNT(
DISTINCT `crm_orderhistory`.`order_date`,
`crm_orderhistory`.`client_id`)
Сюда зачем-то в GROUP BY падает то, что должно быть ТОЛЬКО в SELECT
вот clients
SELECT
EXTRACT( MONTH FROM `crm_orderhistory`.`order_date` ) AS `month`
FROM
`crm_orderhistory`
WHERE
( `crm_orderhistory`.`order_date` >= "2022-01-18" AND `crm_orderhistory`.`order_date` <= "2023-01-20" )
ORDER BY
`crm_orderhistory`.`order_date` DESC
В clients
не показывается GROUP BY
который с order_date
идет, но это неважно, главный вопрос, почему то что пошло в SELECT
пошло и в GROUP BY
, я про COUNT
переменная kek
это самописаня функция для sql, вот её код:
class CustomCount(Func):
function = 'COUNT'
arg_joiner = ', '
template = "%(function)s(DISTINCT %(expressions)s)"
output_field = IntegerField()
Вот весь код представленный выше, только без обрезок:
class CustomCount(Func):
function = 'COUNT'
arg_joiner = ', '
template = "%(function)s(DISTINCT %(expressions)s)"
output_field = IntegerField()
@handle_data_for_chart
def get_average_receipt(clients: QuerySet[OrderHistory]):
kek = CustomCount('order_date', 'client')
result = (clients
.values_list(Sum('summa') / kek)
)
return result
Декоратор handle_data_for_chart
обрабатывает предварительно данные, кинул их они получаются в ссылке client
но это тоже не важно.
Главный вопрос продублирую:
главный вопрос, почему то что пошло в
SELECT
пошло и вGROUP BY
, я проCOUNT