4

ORM と QuerySet API を使用して Django でマルチジョイン クエリを実行するための最良および/または最速の方法は何ですか?

4

4 に答える 4

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")
于 2008-09-16T15:05:54.540 に答える
2

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 に実際に顕著なパフォーマンスの違いがある理由を説明してくれることを願っています)。

于 2008-09-16T15:18:00.720 に答える
1

queryset.query.join メソッドを使用しますが、ここで説明されている他の方法 (2 つのアンダースコアを使用) が適切でない場合にのみ使用してください。

于 2008-12-16T17:42:12.523 に答える
0

Caktus ブログには、これに対する回答があります: http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

基本的に、カスタム結合を追加できる隠し QuerySet.query.join メソッドがあります。

于 2009-12-12T19:01:38.993 に答える