Какой правильный способ фильтрации данных из базы данных на ежемесячной и ежегодной основе для аналитики?

Я делаю раздел аналитики для своего клиента, где мне нужно отображать данные в графическом виде. Для этого я использую chart js. Сейчас у меня есть модель для хранения посетителей сайта. Теперь я хочу отфильтровать данные по месяцам и годам, поместить их в chart 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()

Здесь я могу получить счетчик для текущего месяца и года. Но создание переменных для каждого месяца и года не является правильным решением.

Подскажите, пожалуйста, как правильно отфильтровать данные, чтобы я мог сделать аналитику. Я никогда раньше этого не делал, поэтому я не знаю правильного подхода, пожалуйста, подскажите мне.

Также код chart 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
            }
        }
    }
});

Пожалуйста, подскажите, что мне делать

вы можете использовать annotate в django.

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 примерно такого вида.

<QuerySet [{'created_at__month': 1, 'total_in_month': 5458}, {'created_at__month': 2, 'total_in_month': 4555}]
Вернуться на верх