2016-05-23 7 views
1

のは、私は、次のDjangoのモデルを持っているとしましょう:Djangoの効率的な検索:全クエリセットVS関連マネージャ

class X(models.Model): 
    some_field = models.FloatField() 


class Y(models.Model): 
    x = models.ForeignKey(X) 
    another_field = models.DateField() 

はのは、私は、特定の日付(lookup_date)と、Yの特定のインスタンスを探して所属していましょうあるxまでどのオプションがあれば、より効率的なルックアップだろう?:

1 Y.objects.get(X = xで、another_field = lookup_date)

または関連マネージャを使用して:

2. x.y_set.get(another_field = lookup_date)

+0

私はあなたがそれらの最後に '.query'を追加する場合はかなり確信してます同じクエリを生成する可能性があります。いずれにせよ、[競走馬](https://ericlippert.com/2012/12/17/performance-rant/) – Sayse

+0

あなたは100%正しいです、それは同一です。私は.queryについて知らなかった。それらの1つはより多くのpythonicと考えられていますか?答えにあなたのコメントを置くことができます。私はそれを正しいものとしてマークします。 – Johan

答えて

2

おそらく、同じクエリが生成されていることがわかります。結果のSQLを表示するクエリの末尾に.queryを追加するとチェックできます。

Y.objects.get(x=x, another_field=lookup_date).query 
x.y_set.get(another_field=lookup_date).query 

しかし、いずれにせよ、これはマイクロ最適化であり、あなたはそれが面白いEric Lippert's performance rantを読み取ることがあります。

これらのうちの1つは、より多くのpythonicと考えられていますか?

はそうでもない、私はそれが標準pep8の行の長さに適合することを少し簡単に作ることができるので、第二を使用する傾向がある

+1

偉大な投稿、ありがとう – Johan

+1

私はまた、読み取り中にもフローを提供するので、可能な限り、2番目のオプションを使用しようとします。特に 'related_name'をForeignKeyと一緒に使用するとします。 – AKS

+1

@AKS - 私はそれが意見のより多くであるのでそれに私の答えに追加しなかったが、クエリーセットの意図もより明確になることを同意する。 – Sayse

関連する問題