Django/Python: Объединять вызовы фильтров одного типа?
У меня есть такой код:
report = {
'period': {
'actions': [a.for_report() for a in team_actions.filter(type=Action.ACTION)],
'events': [e.for_report() for e in team_actions.filter(type=Action.EVENT)],
'timeskip': [t.for_report() for t in team_actions.filter(type=Action.TIMESKIP)],
'buysell': [b.for_report() for b in team_actions.filter(type=Action.BUYSELL)],
}
# This is what the for_report function does
def for_report(self):
return {
'name': self.name,
'value': self.value,
}
Как вы можете видеть, я делаю практически одно и то же 4 раза, просто в конце я фильтрую для другого типа Action. Поэтому я хочу улучшить свои запросы и хотел бы узнать, есть ли умное решение для выполнения подобных действий, которое также является более производительным?
Спасибо за любые ответы!
Вы можете получить все результаты в одном запросе, а затем использовать itertools.groupby для группировки по type
keyfunc = lambda obj: obj.type
query = team_actions.order_by('type')
report = {
'period': {key: [x.for_report() for x in group] for key, group in itertools.groupby(query, keyfunc)}
}