Django Query для подсчета записей каждый месяц - PullRequest
0 голосов
/ 16 сентября 2018
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

1 Ответ

0 голосов
/ 16 сентября 2018

Используйте 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}]>
...