我有以下型号:
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()),
)
但这也以错误告终。