2017-11-08 4 views
0

Djangoのオブジェクトをフィルタリングする最適な方法は何ですか?Djangoでオブジェクトをフィルタリングする最も実用的で効率的な方法は?

私の場合、GET requestによって送信された異なるパラメータでオブジェクトをフィルタリングする必要があります。だから、CBVの私のget_querysetに私は私のカスタムmodels.QuerySetのカスタム関数に値を送信し、その結果取得:

return MyModel.objects.all().custom_filter(param1, param2, param3) 

しかし、私のカスタム関数では、最も疑わしいものが起こっています。

  1. まず、渡された値をチェックし、それらをクリーニングします。
  2. 次に、すべてのparam Iフィルタクエリセットに対して、Q Objectsを使用して個別にフィルタを設定します。これは、その時のために正常に動作

    def custom_filter(self, param1, param2, param3): 
        # cleaning and checking staff 
        # ... then 
        result = self.filter(Q() | Q()) # related to param1 
        if (param2 != None): 
         result = result.filter(Q()) # related to param2 
        if (param3 != None): 
         result = result.filter(Q() & Q()) # related to param3 
        # and etc. 
        return result.distinct() 
    

:のようにカスタムmodels.QuerySetではそれが見えます。しかし、私はそれが確かに非効率だと思う。誰かがより良い解決策を持っているなら、それを提供してください。

答えて

1

とは思わないでください。クエリを実行するにはどのくらい時間がかかりますか? の生産スタイル領域でテストしてからを導入することはできますか?

任意のクエリセットの.queryを見ると、データベースに送信されたクエリを表示できます。このように実際のクエリを見ることで、クエリが恐ろしいかどうかについてより良いアイデアが得られます。あなたは、より高度な故障をしたい場合は

print unicode(MyModel.objects.all().custom_filter(param1, param2, param3).query) 

、通常、私はこれらを取り、データベース上のEXPLAIN ANALYSEにそれをポップ。それはあなたのデータベースが実際にあなたの結果を収集するために使用している魔法の完全な内訳を与えるでしょう。このメソッドの詳細については、データベースのドキュメントを参照する必要があります。

最後に - おそらく最も重要なのは - querysets only evaluate when they have toです。提供した例では、データベースクエリはまったく行われません。あなたはそれが間違いなく効率が悪いと思っていますが、なぜそれを考えるのかはわかりません。

+0

私はDjangoでかなり新しいです。私は本当に 'QuerySet'が怠惰だとは知らなかった。 – catscoolzhyk

+0

それは大きな違いになります:) – Shadow

関連する問題