[英]Django annotate group by date return object
我正在使用來自聚合文檔的 Django annotate
。
我的目標是按日期對模型進行分組,並以這種形式返回與每個日期關聯的所有對象:
[{
'date': datetime.datetime(2019, 6, 22, 11, 35),
'instances': [<Model: (1)>, <Model: (2)> ]
},
{
'date': datetime.datetime(2019, 6, 21, 11, 35),
'instances': [<Model: (3)>, <Model: (6)> ]
},]
我嘗試了以下查詢:
Flight.objects.values('origin_scheduled_dep').annotate(Count('origin_scheduled_dep')).order_by('origin_scheduled_dep')
但這返回了我指定的values
:
<QuerySet [{'origin_scheduled_dep': datetime.datetime(2019, 6, 22, 11, 35), 'origin_scheduled_dep__count': 1}, {'origin_scheduled_dep': datetime.datetime(2019, 6, 22, 15, 40), 'origin_scheduled_dep__count': 1}, {'origin_scheduled_dep': datetime.datetime(2019, 6, 22, 22, 0), 'origin_scheduled_dep__count': 2}]>
一直以來謝謝您的幫助:)
from django.db.models.functions import TruncDate
Flight.objects.annotate(date=TruncDate('origin_scheduled_dep')).values('date').annotate(count=Count('date')).order_by('date')
僅供參考:如果您正在使用MySQL並使用django中的時區支持,請使用mysql_tzinfo_to_sql
將時區表加載到MySQL數據庫中( reference
)。 這樣的SO answer
可能對此有所幫助。
我認為僅使用django queryset函數無法實現您的預期結果。 因此,我認為您需要使用一些python函數來實現它,如下所示:
from collections import defaultdict
results = defaultdict(list)
queryset = Flight.objects.annotate(date=TruncDate('origin_scheduled_dep')).order_by('date')
for flight in queryset:
results[flight.date].append(flight)
for key, value in results.items():
print(key,value)
或者,您可以使用regroup
模板標簽顯示層次結構列表。
您將需要混合使用TruncDate
, order_by
和itertools.groupby
from itertools import groupby
from operator import attrgetter
queryset = Flight.objects.annotate(
date=TruncDate('origin_scheduled_dep'),
).order_by('date')
grouped = [
{'date': date, 'instances': instances}
for date, instances in itertools.groupby(
queryset.iterator(), attrgetter('date')
)
]
我認為它會根據您的需要工作,但我認為這不是解決問題的最佳方法
from django.db.models import Count
times = Flight.objects.values_list('origin_scheduled_dep', flat=True).annotate(Count('origin_scheduled_dep'))
my_list = []
for time in times:
my_list.append({'date': time, 'instances': Flight.objects.filter(origin_scheduled_dep=time)})
我嘗試使用Django ORM進行此操作,但我無法通過820個重復值對330000的數據集進行此測試,其中一些值包含2200個以上的實例,時間很好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.