Проблема
У нас есть такая схема:# категория афиши class CategoryPlaybill(models.Model): ... # афиша class Playbill(models.Model): categories = models.ManyToManyField(CategoryPlaybill, ...) ... # проведение афиши class ConductingPlaybill(models.Model): playbill = models.ForeignKey(Playbill, ...) ...Итак, есть типы событий. Есть события по многие-ко-многим (событие может входить в несколько категорий). А есть их так называемые проведения — событие с конкретной датой, временем, местом. Мне надо получить проведения событий с разбивкой по категориям: категория1=>(список проведений), категория2 =>(список проведений).
Приходит в голову решение в лоб:
cond_playbill_list = ConductingPlaybill.objects.select_related().all() cond_playbill_map = {} for cond_playbill in cond_playbill_list: cats = cond_playbill.playbill.categories.all() for cat in cats: if cat not in cond_playbill_map: cond_playbill_map[cat] = [] cond_playbill_map[cat].append(cond_playbill)Но это решение ожидаемо даёт кучу запросов в БД на предмет
SELECT FROM categoryplaybill WHERE playbill_categories.playbill_id = N
для каждой итерации внешнего цикла. Дело в том, что select_related не тянет playbill_categories и ниже.