每月和每年从数据库中过滤数据以进行分析的正确方法是什么?

what is the correct way to filter data from db in monthly and yearly basis for analytics?

我正在为我的客户制作一个分析部分,我需要在其中以图形形式显示数据。为此,我正在使用图表 js。现在我有一个模型来存储网站的访问者。现在我想按月和按年过滤数据,将其放入图表 js 中并以图形方式显示。 现在我正在做的是这个

monthly_visitor = VisitorCount.objects.all().filter(date_of_record__month = today.month).count()

yearly_visitor = VisitorCount.objects.all().filter(date_of_record__year = today.year).count()

在这里,我可以获得当前月份和年份的计数。但是为每个月和每年做变量是不对的。

所以请建议我过滤数据的正确程序是什么,以便我可以进行分析。我从来没有这样做过,所以我没有做正确的做法,请给我建议。

图表 js 代码也像这样,这也可能没有正确的分析方法

const vismonth = document.getElementById('visitorMonthly').getContext('2d');
const visitorMonthly = new Chart(vismonth, {
    type: 'bar',
    data: {
        labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
        datasets: [{
            label: 'Visitors Monthly',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255, 99, 132, 1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            y: {
                beginAtZero: true
            }
        }
    }
});

const visyear = document.getElementById('visitorYearly').getContext('2d');
const visitorYearly = new Chart(visyear, {
    type: 'bar',
    data: {
        labels: ['2022', '2023', '2024', '2025', '2026', '2027'],
        datasets: [{
            label: 'Visitors Yearly',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255, 99, 132, 1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            y: {
                beginAtZero: true
            }
        }
    }
});

请建议我该怎么做

你可以在 django 中使用 annotate

from django.db.models import Count

monthly_visitor = VisitorCount.objects.all().values(
    'date_of_record__month'
    ).annotate(
        total_in_month=Count('id') # take visitor_id or whatever you want to count
        ).order_by()

它会给你类似的查询集。

<QuerySet [{'created_at__month': 1, 'total_in_month': 5458}, {'created_at__month': 2, 'total_in_month': 4555}]