Django Разбить Queryset на подзапросы на основе параметров - PullRequest
0 голосов
/ 18 апреля 2020

Я ищу функциональность, подобную "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

Будем весьма признательны за любые указания!

1 Ответ

0 голосов
/ 23 апреля 2020

вы можете использовать groupby из 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}]


Я немного запутался, если это то, что вы ожидали, я надеюсь, что решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...