私は次のモデルを持っています:
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_related('blocklink_set')
ましたが、次のエラーが発生します。
Cannot find 'blocklink_set' on Block object, 'blocklink_set' is an invalid parameter to prefetch_related()
2回目の試みは
.prefetch_related(
Prefetch('blocklink', queryset=BlockLink.objects.all()),
)
しかし、それもエラーで終わります。