Tôi có ứng dụng django đang thực hiện một số lần ghi nhật ký. Mô hình của tôi trông giống như sau:Tổng số bản ghi Django mỗi ngày
class MessageLog(models.Model):
logtime = models.DateTimeField(auto_now_add=True)
user = models.CharField(max_length=50)
message = models.CharField(max_length=512)
Điều muốn làm là nhận được số lượng thư trung bình được ghi lại mỗi ngày trong tuần để tôi có thể xem ngày nào hoạt động nhiều nhất. Tôi đã quản lý để viết truy vấn kéo tổng số thư mỗi ngày là:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).count()
Nhưng tôi đang gặp khó khăn khi tính trung bình trong truy vấn. Những gì tôi có ngay bây giờ là:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).annotate(num_msgs=Count('id')).aggregate(Avg('num_msgs'))
Vì lý do nào đó, điều này sẽ trở lại 1.0 cho mỗi ngày. Tôi nhìn vào SQL nó được tạo ra và nó là:
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
Tôi nghĩ rằng vấn đề có thể đến từ id GROUP BY nhưng tôi không thực sự chắc chắn. Ai có ý tưởng hay gợi ý nào không? Cảm ơn trước!
Cảm ơn bạn đã giải thích! Điều đó làm cho rất nhiều ý nghĩa. Tôi đã thử sử dụng mệnh đề bổ sung, tuy nhiên bây giờ tôi nhận được một lỗi SQL. Tôi đã sửa đổi truy vấn của mình thành: MessageLog.objects.filter (logtime__week_day = i) .extra ({'date_logged': "date (logtime)"}). Giá trị ('date_logged') .annotate (num_msgs = Count ('id')) .trung bình (Trung bình ('num_msgs')) Và lỗi tôi nhận được là "Bạn có lỗi trong cú pháp SQL của mình; hãy kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp đúng sử dụng gần 'FROM (SELECT (ngày (logtime)) AS 'date_logged', COUNT (' myapp_messagelog'.'id' tại dòng 1 ") – bb89
Vâng, điều đó không hoàn toàn hoạt động, phải không? Điều khoản tổng hợp ném nó đi - nó Bạn có thể nhận được tổng số lượng tin nhắn trong một vài ngày trong tuần theo nhiều cách khác nhau, nhưng tôi không thể tìm ra cách để làm cho ORM của Django thực hiện điều này trong một cuộc gọi. những gì tôi đã đưa ra wit h vào câu trả lời của tôi. –
Tôi thực sự đã kết thúc việc tạo ra một khung nhìn (thực sự cần 2 cho mysql) và sau đó là một mô hình không được quản lý như bạn đã đề xuất và nó hoạt động hoàn hảo. Tôi sẽ thêm một bài đăng khác giải thích những gì tôi đã làm sau đó cho những người có thể quan tâm. Cảm ơn một lần nữa vì tất cả sự giúp đỡ của bạn! – bb89