Python Django按日期注释分组返回对象

Python Django按日期注释分组返回对象,python,django,django-models,Python,Django,Django Models,我使用的是Django的注释 我的目标是按日期对模型进行分组,并在此表单中返回与每个日期关联的所有对象: [{ 'date': datetime.datetime(2019, 6, 22, 11, 35), 'instances': [<Model: (1)>, <Model: (2)> ] }, { 'date': datetime.datetime(2019, 6, 21, 11, 35), 'instances': [<Model: (3)

我使用的是Django的
注释

我的目标是按日期对模型进行分组,并在此表单中返回与每个日期关联的所有对象:

[{
  '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)>  ]
},]
但这将返回我指定的
值:

<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 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做这个,但我做不到 所以我
在330000个数据集上测试了这一点,其中包含820个重复值,有些值的实例数超过2200个,时间很好

您可以使用以下方法进行此操作:

FYI:如果您正在使用MySQL并使用django提供的时区支持,则使用
MySQL\u tzinfo\u to\u sql
将时区表加载到MySQL数据库()。这可能有助于解决这个问题


更新 我认为仅使用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)

或者,您可以使用模板标记来显示分层列表。

您需要混合使用
TruncDate
order\u 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')
    )
]

在示例输出中,您显示了您想要对象实例本身,但在示例代码中,您暗示您只想要计数。它是哪个?换句话说,
,是实例的默认字符串值,因此表示您拥有或想要该实例。如果您只需要计数,那么您的输出可能会类似于
{'date':…,'instance_count':2}
。我想返回按日期分组的实际模型实例,其中日期对该日期出发的所有航班都有自己的属性值谢谢您的回答,但这只返回flight对象。我想按照问题中显示的日期对它们进行分组对不起,我错过了
值(“日期”)
。我已经更新了我的答案实际上这个查询仍然返回对象的计数,而不是对象本身。查看我想在问题中得到的输出
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)
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')
    )
]