Я пытаюсь выполнить следующий запрос, используя Django ORM:
SELECT object_repr, content_type_id, COUNT(object_repr)
FROM django_admin_log GROUP BY object_repr ORDER BY COUNT(object_repr);
Самое близкое, что я получил:
LogEntry.objects.values('object_repr', 'content_type__id')\
.annotate(num_logs=Count('object_repr'))\
.order_by('num_logs')
К сожалению, это приводит к SQL-выражению, которое возвращаетнеправильный (или, по крайней мере, неожиданный) результат:
SELECT `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`,
COUNT(`django_admin_log`.`object_repr`) AS `num_logs`
FROM `django_admin_log`
GROUP BY `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`
ORDER BY num_logs
Метод values () включает все указанные столбцы в сегменте «GROUP BY», и я не хочу, чтобы content_type_id
в моей группе GROUPОТ.Возможно ли это сделать в ORM?
edit: Оказывается, что это невозможно в ORM.Однако в интересах будущих людей найти этот вопрос, я написал запрос, который делает то, что мне нужно:
SELECT DISTINCT djl2.id, djl1.object_id, djl1.object_repr,
djl1.content_type_id,
COUNT(djl1.content_type_id) AS num_items
FROM django_admin_log AS djl1
INNER JOIN django_admin_log AS djl2
ON djl1.id=djl2.id
GROUP BY djl1.object_repr, djl1.content_type_id
ORDER BY num_items
По сути, внутреннее соединение.Удачи и надеюсь, что это поможет.