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()),
)
но это также заканчивается ошибкой.