Проблема
У нас есть такая схема:# категория афиши
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 и ниже.