ORM と QuerySet API を使用して Django でマルチジョイン クエリを実行するための最良および/または最速の方法は何ですか?
4 に答える
ForeignKeys または ManyToManyField 関係によってリンクされたテーブル間で結合しようとしている場合は、二重アンダースコア構文を使用できます。たとえば、次のモデルがあるとします。
class Foo(models.Model):
name = models.CharField(max_length=255)
class FizzBuzz(models.Model):
bleh = models.CharField(max_length=255)
class Bar(models.Model):
foo = models.ForeignKey(Foo)
fizzbuzz = models.ForeignKey(FizzBuzz)
次のようなことができます:
Fizzbuzz.objects.filter(bar__foo__name = "Adrian")
API を使用しないでください ;-) 真剣に、JOIN が複雑な場合は、API を使用するのではなく、SQL にドロップダウンすることでパフォーマンスが大幅に向上するはずです。これは、美しい Python コード全体に汚い汚い SQL を適用する必要があるという意味ではありません。JOIN を処理するカスタム マネージャーを作成し、コードの残りの部分で直接 SQL を使用するのではなく、それを使用するようにします。
また、私はちょうど DjangoCon に参加し、高性能 Django に関するセミナーが開催されました。そこで学んだ重要なことの 1 つは、パフォーマンスが本当に問題である場合 (そして、いつかかなりのトラフィックを予定している場合)、そもそも JOIN を行うべきではありません。適切なパフォーマンスを維持しながらアプリをスケーリングすることは事実上不可能だからです。
Google がこの話を基に作成したビデオは次のとおりです 。
もちろん、アプリケーションがそのようなスケーリングの問題に対処する必要がないことがわかっている場合は、参加してください :-) そして、API を使用することによるパフォーマンスへの影響も心配していない場合は、本当に心配する必要はありません。ある API メソッドを別の API メソッドよりも使用する場合のパフォーマンスの違いがあれば、(AFAIK) ごくわずかな違いについて心配する必要はありません。
使用するだけです: http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships
それが助けになることを願っています (そうでない場合は、真の Django ハッカーが飛び込んで、メソッド X に実際に顕著なパフォーマンスの違いがある理由を説明してくれることを願っています)。
queryset.query.join メソッドを使用しますが、ここで説明されている他の方法 (2 つのアンダースコアを使用) が適切でない場合にのみ使用してください。
Caktus ブログには、これに対する回答があります: http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/
基本的に、カスタム結合を追加できる隠し QuerySet.query.join メソッドがあります。