簡體   English   中英

Django按日期返回對象注釋組

[英]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}]>

一直以來謝謝您的幫助:)

您可以使用TruncDate這樣TruncDate

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模板標簽顯示層次結構列表。

您將需要混合使用TruncDateorder_byitertools.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM