use*_*774 2 python django count
我将 Django1.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)
Run Code Online (Sandbox Code Playgroud)
我想计算当月以及过去 6 个月的活动类型(1、2、3 或 4)的记录数。
例如,整个当月(2019 年 4 月)的计数。
一个月前的计数(2019 年 3 月整月)。
两个月前的计数(2019 年 2 月整月)等。
我可以编写计数查询,但我不确定如何为每个整月添加过滤器。
这是我的查询:
test_count = PublishedRecordedActivity.objects.filter(activity_type=1).count
Run Code Online (Sandbox Code Playgroud)
首先,找出您要过滤的月份。为此,请使用dateutil包relativedelta中的函数
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)
Run Code Online (Sandbox Code Playgroud)
modified_from_datetime然后在过滤器中使用该变量gte,
PublishedRecordedActivity.objects.filter(activity_type=1, timestamp_added__gte=modified_from_datetime)Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
使用分组功能作为,
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'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2248 次 |
| 最近记录: |