0

我有以下型号:

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 using的解决方案, .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()),
)

但这也以错误告终。

4

0 回答 0