django で三つのテーブルを結合して filter をした時に躓いたのでメモ

構造

よくある Tag 付けの構造です。
Point と Tag のテーブルがあり、それを紐づける TagManager というテーブルがあります。
関係性は ManyToMany です。

この Tag 側にフィルターをかけようとしましたが躓いたのでメモしておきます。

コード

【NGなコード】

points = Point.objects.prefetch_related(
    Prefetch(
        "tagmanager_set", queryset=TagManager.objects.select_related("tag").filter(tag__id__in=tag_ids)
    )
).filter(name__contains=searchText,)

【OKなコード】

points = Point.objects.prefetch_related(
    Prefetch(
        "tagmanager_set", queryset=TagManager.objects.select_related("tag").all()
    )
).filter(name__contains=searchText, tagmanager__tag_id__in=tag_ids)
YouTube