Python Django按日期注释分组返回对象
我使用的是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)
注释
我的目标是按日期对模型进行分组,并在此表单中返回与每个日期关联的所有对象:
[{
'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')
)
]