2016-09-09 9 views
3

Djangoモデルのインスタンスでmap、filter、およびreduce関数を使用できるかどうかは特に気になります。私ができない場合、Djangoでクエリをフィルタリングする関数を渡す組み込みの方法がありますか?Djangoの指定された関数でフィルタリングする組み込みの方法はありますか?

わかりやすくするために、私の本当の問題を実証しましょう。私はstops_forwardsstops_backwards内ArrayFieldsが埋め込まれている、あなたが上見ることができるように

class Route(models.Model): 
    stops_forwards = ArrayField(
    ArrayField(
     models.PositiveIntegerField(), 
     size=2 
    ), 
    default=[], 
    verbose_name="Stops Forwards (Ordered)" 
    ) 

    stops_backwards = ArrayField(
    ArrayField(
     models.PositiveIntegerField(), 
     size=2 
    ), 
    default=[], 
    verbose_name="Stops Backwards (Ordered)" 
    ) 

:私はArrayFieldを使用するためにはPostgreSQLを使用して、私は以下のように似たモデルを持っています。私はそれを順番に保つために埋め込まれたものを使います。例えば、データは以下の通りです:

[ 
    [1, 35], 
    [2, 40], 
    [3, 180], 
    [4, 285] 
    # ... and it goes 
] 

私は何をしたいことは、特定の停止IDかどうかを確認することです(285等)が埋め込まれたArrayFieldです。

filter(lambda: has_route_stop(285), instances) 

それとも、これを行うためのDjangoのAPIの組み込みの方法があります:私は、私はそれがどのように動作するかわかりませんが、私は以下のようにそれを呼び出すhas_route_stopと呼ばれる機能を持っていると仮定すると?


環境

  • のPython 3.5.1
  • Djangoは1.9.9
  • のPostgreSQL 9.5.4
  • psycopg2 2.6.2
+1

"ヒント:配列はセットではありません;特定の配列要素を検索することは、データベースの誤った設計の兆候となります。配列要素となるアイテムごとに別のテーブルを使用することを検討してください。多数の要素のためにより良いスケールになる可能性が高い」と語った。 – e4c5

+0

はい、より良い解決策です。しかし、私が書いたカスタムスクリプトでは、データの順序が混ざり合っています(または、Djangoがクエリを実行するときにシャッフルしますが、わかりません)。だから、私はそれが整数としての命令でそれらを保つためのより良い解決策だと思った。しかし、私は組み込み配列の使用を避けるために何ができるかを見ていきます。ありがとう。 :) –

答えて

3

DjangoのPostgresの統合は、ことができますを使用して埋め込み配列でクエリを実行する演算子。だからあなたはできる:

Route.objects.filter(stops_forwards__contains=[285]) 

the ArrayField documentationを参照してください。

+0

それは解決策です、ありがとう。 :) –

関連する問題