У меня есть приложение django, которое делает некоторые записи. Моя модель выглядит следующим образом:Django совокупное количество записей в день
class MessageLog(models.Model):
logtime = models.DateTimeField(auto_now_add=True)
user = models.CharField(max_length=50)
message = models.CharField(max_length=512)
Что нужно сделать, это получить среднее количество сообщений, записываемых в день недели, так что я могу видеть, какие дни являются наиболее активными. Я успел написать запрос, который вытягивает общее количество сообщений в день, который является:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).count()
Но у меня возникают проблемы расчета в среднем в запросе. То, что у меня есть сейчас:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).annotate(num_msgs=Count('id')).aggregate(Avg('num_msgs'))
По какой-то причине это возвращает 1.0 за каждый день. Я посмотрел на SQL это генерирующее и это:
SELECT AVG(num_msgs) FROM (
SELECT
`myapp_messagelog`.`id` AS `id`, `myapp_messagelog`.`logtime` AS `logtime`,
`myapp_messagelog`.`user` AS `user`, `myapp_messagelog`.`message` AS `message`,
COUNT(`myapp_messagelog`.`id`) AS `num_msgs`
FROM `myapp_messagelog`
WHERE DAYOFWEEK(`myapp_messagelog`.`logtime`) = 1
GROUP BY `myapp_messagelog`.`id` ORDER BY NULL
) subquery
Я думаю, что проблема может приходить с GROUP BY ид, но я не совсем уверен. У кого-нибудь есть идеи или предложения? Заранее спасибо!
Спасибо за объяснение! Это имеет большой смысл. Я попытался использовать дополнительное предложение, однако теперь у меня возникает ошибка SQL. Я изменил свой запрос: MessageLog.objects.filter (logtime__week_day = i) .extra ({'date_logged': "date (logtime)"}). Values ('date_logged') .annotate (num_msgs = Count ('id')) .aggregate (Avg ('num_msgs')) И ошибка, которую я получаю, это «У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса используйте «FROM (SELECT (date (logtime)) AS' date_logged', COUNT ('myapp_messagelog'.'id 'в строке 1") – bb89
Да, это не совсем работает, не так ли? Сложное предложение отбрасывает его - это работает с аннотатом. Вы можете подсчитать общее количество сообщений в день недели несколькими разными способами, но я не могу найти способ сделать Django ORM для этого одним вызовом. что я придумал h в мой ответ. –
На самом деле я создал создание (на самом деле нужно 2 для mysql), а затем неуправляемую модель, как вы предполагали, и которая отлично работала. Я добавлю еще одно сообщение, объясняющее, что я сделал позже для тех, кого это может заинтересовать. Еще раз спасибо за вашу помощь! – bb89