Django根据param将Queryset分解为子查询集



我正在寻找一种类似"group_by"的功能,它将允许我将django查询集分离为多个查询集,并按一个参数(在我的情况下,是一个日期(分组。我有一个可行的解决方案,但我知道如果我对更高级的功能有更多的了解,它可以得到很大的改进。

下面是我当前的(丑陋的(代码,让你知道我具体想做什么。

class ClassesListView(ListView):
model = Class
context_object_name = 'classes'
template_name = 'classes/ClassesListTemplate.html'
def get_queryset(self):
qs = super(ClassesListView, self).get_queryset()
return qs.filter(start_datetime__gte = timezone.localtime(timezone.now()))
def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)
qs = self.object_list
querysets = []
for i in range (0, 7):
_date = timezone.localtime(timezone.now()) + timezone.timedelta(days=i)
_qs = qs.filter(start_datetime__date = _date.date())
querysets.append(
{
'date' : _date,
'qs' : _qs
}
)
context_data['querysets'] = querysets
return context_data

如有任何指导,我们将不胜感激!

您可以从itertools.groupby示例

query_sets =  l = [{'date': "2020-04-23 10:57:45", 'qs': 2}, 
{'date': "2020-04-23 10:52:45", 'qs': 3}, 
{'date': "2020-04-23 10:58:45", 'qs': 8}, 
{'date': "2020-04-23 10:57:45", 'qs': 3}]

输出

query_sets                                                                                                                                                                                         
Out[35]: 
[{'date': '2020-04-23 10:57:45', 'qs': 2},
{'date': '2020-04-23 10:52:45', 'qs': 3},
{'date': '2020-04-23 10:58:45', 'qs': 8},
{'date': '2020-04-23 10:57:45', 'qs': 3}]

就像你看到的列表一样,它没有排序

import itertools
def sort_and_group(iterable, key=None): 
"""Group sorted `iterable` on `key`.""" 
return itertools.groupby(sorted(iterable, key=key), key=key)

for k, v in sort_and_group(query_sets, lambda x: x['date']): print(k, list(v))

2020-04-23 10:52:45 [{'date': '2020-04-23 10:52:45', 'qs': 3}]
2020-04-23 10:57:45 [{'date': '2020-04-23 10:57:45', 'qs': 2}, {'date': '2020-04-23 10:57:45', 'qs': 3}]
2020-04-23 10:58:45 [{'date': '2020-04-23 10:58:45', 'qs': 8}]

如果这是你所期望的,我有点困惑我希望的解决方案

最新更新