Django prefetch m2m через модель

У меня есть следующие модели:

class Block(MPTTModel):
    # some fields
    links = models.ManyToManyField('self', through='BlockLink', symmetrical=False)


class BlockLink(models.Model):
    source = models.ForeignKey(
        'Block', on_delete=models.CASCADE, related_name='source_block'
    )
    destination = models.ForeignKey(
        'Block', on_delete=models.PROTECT, related_name='destination_block', null=True
    )
    is_valid = models.BooleanField(default=False)

После этого я могу получить доступ к сквозной модели, используя: my_block.links.through.objects.filter(source=my_block.id)

Моя проблема в том, что я обращаюсь к блокам в цикле, и каждый из блоков создает собственный запрос для выбора сквозной модели. Таким образом, для 5000 блоков у нас есть 5000 дополнительных запросов.

Как это можно предотвратить. Есть ли способ аннотирования или предварительной выборки сквозной модели?

Что я пробовал?

Я попробовал решение из Django prefetch through table используя .prefetch_related('blocklink_set'), но это приводит к следующей ошибке:

Cannot find 'blocklink_set' on Block object, 'blocklink_set' is an invalid parameter to prefetch_related()

Вторая попытка была

.prefetch_related(
    Prefetch('blocklink', queryset=BlockLink.objects.all()),
)

но это также заканчивается ошибкой.

Вернуться на верх