Django Python - количество запросов за месяц и последние 6 месяцев - PullRequest
0 голосов
/ 08 апреля 2019

Я использую Django 1.10.5 с python 3.6.

У меня есть следующий класс модели:

class PublishedRecordedActivity(models.Model):
    published_details = models.ForeignKey(PublishedDetails, null=True, blank=True, on_delete=models.CASCADE)
    timestamp_added = models.DateTimeField(auto_now_add=True)
    activity_type = models.IntegerField(null=False, blank=False, default=1)

Я хочу подсчитать количество записей для действиявведите (1, 2, 3 или 4) для текущего месяца, а также для каждого из последних 6 месяцев.

Например, подсчет за весь текущий месяц (апрель 2019 г.).

Счет за месяц назад (весь месяц марта 2019 г.).

Подсчет за два месяца назад (весь месяц февраля 2019 г.) и т. Д.

Я могу написать запрос для подсчета, но я не уверен, как добавить фильтр для каждогоВесь месяц.

Вот мой запрос:

test_count = PublishedRecordedActivity.objects.filter(activity_type=1).count

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Изначально определите месяц, в котором вы хотите фильтровать.Для этого используйте функцию relativedelta из dateutil пакет

In [33]: from datetime import datetime                                                                                                                                                                             

In [34]: from dateutil.relativedelta import relativedelta                                                                                                                                                          

In [35]: months_before = 6                                                                                                                                                                                         

In [36]: now = datetime.utcnow()                                                                                                                                                                                   

In [37]: now                                                                                                                                                                                                       
Out[37]: datetime.datetime(2019, 4, 8, 5, 6, 42, 300424)

In [38]: from_datetime = now - relativedelta(months=months_before)                                                                                                                                                 

In [39]: from_datetime                                                                                                                                                                                             
Out[39]: datetime.datetime(2018, 10, 8, 5, 6, 42, 300424)

In [40]: modified_from_datetime = from_datetime.replace(day=1, hour=0, minute=0, second=0, microsecond=0)                                                                                                          

In [41]: modified_from_datetime                                                                                                                                                                                    
Out[41]: datetime.datetime(2018, 10, 1, 0, 0)

Затем используйте переменную modified_from_datetime в вашем фильтре с gte,

PublishedRecordedActivity.objects.filter(activity_type=1, <b>timestamp_added__gte=modified_from_datetime</b>)

Полный фрагмент

from datetime import datetime
from dateutil.relativedelta import relativedelta

months_before = 6
now = datetime.utcnow()
from_datetime = now - relativedelta(months=months_before)
modified_from_datetime = from_datetime.replace(day=1, hour=0, minute=0, second=0, microsecond=0)

PublishedRecordedActivity.objects.filter(activity_type=1, timestamp_added__gte=modified_from_datetime)

UPDATE-1

Использовать функцию группировки как,

from django.db.models.functions import TruncMonth
from django.db.models.aggregates import Count

aggregated = PublishedRecordedActivity.objects.filter(
    activity_type=1).annotate(month=TruncMonth('timestamp_added')).values('month').annotate(sum_by_month=Count('month'))
0 голосов
/ 08 апреля 2019

Вы можете получить ежемесячные агрегированные значения, используя функцию базы данных Django annotate и TruncMonth и Count.Пример использования приведен ниже

т. Е.

from django.db.models.functions import TruncMonth

aggregated = PublishedRecordedActivity.objects.filter(activity_type=1).annotate(month=TruncMonth('timestamp_added').values('month').annotate(sum_by_month=Count('id'))

Это даст вам ежемесячные агрегированные подсчеты определенного вида деятельности.Вы можете добавить другой фильтр, применяя временной диапазон в поле timestamp_added.

, если хотите агрегировать только за последние 6 месяцев, а не следовать.

from datetime import date, timedelta
current_date = date.today()
months_ago = 6
six_month_previous_date = current_date - timedelta(days=(months_ago * 365 / 12))

aggregated = PublishedRecordedActivity.objects.filter(activity_type=1, timestamp_added__gte=six_month_previous_date).annotate(month=TruncMonth('timestamp_added').values('month').annotate(sum_by_month=Count('id'))

Заменить months_ago с суммой месяцев, которую вы хотите

Это поможет вам.Если потребуется дополнительная помощь, оставьте комментарии ниже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...