class Orders(models.Model):
orderid = models.IntegerField(db_column='orderID', primary_key=True)
pickupdate = models.DateField(db_column='pickupDate', blank=True, null=True)
我想显示模型中每个月的总记录。我找到的解决方案要求我输入年份
Orders.objects.filter(pickupdate__year = '2006').values_list('pickupdate__month').annotate(total = Count('orderid')
上面的查询集的结果如下:
<QuerySet [(1, 31), (2, 27), (3, 31), (4, 30), (5, 31), (6, 29), (7, 30), (8, 31), (9, 30), (10, 31), (11, 30),
(12, 31)]>
我希望查询集能够从数据库中自动获取每月范围,而无需在查询集中添加年份
我要显示的数据是这样的:
Month | Total
January 2007 | 1
February 2007| 2
etc
enter code here
答案 0 :(得分:3)
使用TruncMonth
数据库函数从日期字段中提取月份
做这样的事情,
from django.db.models import Count
from django.db.models.functions import TruncMonth
Orders.objects.annotate(month=TruncMonth('pickupdate')).values('month').annotate(total=Count('orderid'))
此ORM将生成一个SQL查询,
SELECT django_date_trunc('month', "sample_orders"."pickupDate") AS "month", COUNT("sample_orders"."orderID") AS "total" FROM "sample_orders" GROUP BY django_date_trunc('month', "sample_orders"."pickupDate")
示例
In [8]: from django.db.models import Count
In [9]: from django.db.models.functions import TruncMonth
In [10]: Orders.objects.annotate(month=TruncMonth('pickupdate')).values('month').annotate(total=Count('orderid'))
Out[10]: <QuerySet [{'month': datetime.date(2018, 8, 1), 'total': 2}, {'month': datetime.date(2018, 9, 1), 'total': 4}]>