私は単純な階層モデルを持っています。 Artist、Album、Songと言ってみましょう。私の見解では、結果のツリーをフィルタリングする効率的な方法は何でしょうか?任意の条件で濾過私のテンプレートに渡すアーティスト/アルバム/ソングツリーを取得するにはDjangoの階層構造を効率的にフィルタリングするには?
は、私は現在のようなものをやっている:
for current_artist in Artist.objects.filter(album__song__genre='funkadelic mariachi').distinct():
yield current_artist
for current_album in Album.objects.filter(song__genre='funkadelic mariachi').distinct():
yield current_album
for current_song in Song.objects.filter(genre='funkadelic mariachi'):
yield current_song
yield 'End of album'
yield 'End of artist'
しかし、私はそこにする必要があり、かなり確信していますdistinct()とDjangoの最適化が虹の向こう側からいくつかの魔法のキャッシュを提供していない限り、すべてのレベルで葉までのすべての方法を照会するよりはるかに効率的な方法です。
おそらく木全体を作成する(vg.すべてのアーティストとアルバム、葉をチェックしないで)、そして葉のない枝を刈る?または、私はselect_related()を見ているべきですか?
追加のポイントについては、実際のテスト/ベンチマーク/筆記テストを歓迎します。ダンケ!
P.S:私はdjango-mpttの良さを知っていますが、これは残念です。
私は一般的な解決策を探しているとして、詳細なモデルは、重要ではありませんが、それはのようなものが考えられます。私は次のようになってしまった
class Artist:
name = models.CharField(max_length=200)
class Album:
name = models.CharField(max_length=200)
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
class Song:
name = models.CharField(max_length=200)
album= models.ForeignKey(Album, on_delete=models.CASCADE)
genre = models.CharField(max_length=200)
任意のフィルタに一致するすべての曲の「アーティスト - アルバム - ソング」ツリー(私はfunkadelic mariachisに限らず)です。 – Chema
モデルは、アーティスト、アルバム、ソングの3つのクラスで構成されています。彼らの任意の所有権は無関係であると私は思う。私は単純な一般的な解決策を探しています。 – Chema