2016-12-23 6 views
1

私のdjangoプロジェクトには2つのモデルがあります。djangoの関連フィールドの高速フィルタ

ModelA(models.Model): 
    id = models.AutoField(primary_key=True) 
    field1 = ... 
    ~ 
    fieldN = ... 

ModelB(models.Model): 
    id = models.AutoField(primary_key=True) 

    a = models.ForeignKey(A, on_delete=models.CASCADE) 

    field1 = ... 
    ~ 
    fieldN = ... 

ここで私は1対1の関係A→Bを持っています。表Aには約30の異なるフィールドと10.000+の行があり、表Bには約15と10.000.000+の行があります。最初にいくつかのModelAフィールドでフィルタリングし、次にフィルタリングされたModelA行/オブジェクト関連のそれぞれのオブジェクトに対して、ModelBオブジェクトを取得し、それらを複数のフィールドでフィルタリングする必要があります。その後、私はすべてのModelBが配列として1つのフィールドにパックされているJSONでそれらをシリアル化する必要があります。

これを1〜3秒で実行できますか?はいの場合、最良のアプローチは何ですか?

私はPostgreSQLを使用します。

EDIT:

は、今私は、単純なModelAフィールド上のチェーン.filter()のようにそれをやっているし、その後反復処理QuerySetをもたらし、各ModelAインスタンスに対してModelBのセットされますが、私は疑う、この第二の部分ことソリューションではプロセス全体が遅くなるため、より良い方法があると思います。

+0

実行中のハードウェアがわからないためにクエリがどれくらい時間がかかりますかとは言いませんが、コードを最適化したい場合は、試したことの詳細を提供できる場合に役立ちますこれまでの結果とその結果 – ChidG

+0

@ChidG質問を編集しました – IgorNikolaev

答えて

0

このようなクエリを実行するために速くなることがあります。

model_a_queryset = ModelA.objects.filter(field=whatever) 
model_b_queryset = ModelB.objects.filter(a__in=model_a_queryset) 

Djangoは怠惰なクエリセットevaulationをしているので、これが唯一のデータベースに1枚のヒットになります。

脇に、モデルにid = Autofieldフィールドを定義する必要はありません。 Djangoにはデフォルトでそれらが含まれています。

関連する問題