3
model_one_list = Model1.objects.all()
model_two_list = Model2.objects.filter(...).order_by(..)

for model in model_one_list:
    for model2 in model_two_list:
        if model.field == model2.field:
            another_list.append(model)

django ORM に関するオンラインのヒントでは、メモリを使いすぎてパフォーマンスが低下するため、これを行わないように特に言及されています。ドキュメントでは、可能な限り ORM を使用することをお勧めしています。

上記の問題をこれで解決しようとしました:

Model1.objects.extra(
    where={
        'field = app_model2.field' 
        # Not sure if this works, I think the app_model2 may be wrong idk if i
        # can access that
    },
)

しかし、このようなものについては、それを処理する方法がよくわかりません。

また、少し関連する最後の質問です。単純に順序付けの数でランク付けする必要があるクエリセットがある場合、反復せずにこれを行うための推奨される方法は何ですか?

Model1.objects.order_by('something').extra(select={'rank':
"how do i get the rank in mysql??? like while its
 iterating, is this even possible"})

助けてくれてありがとう。

4

1 に答える 1

6

最初の問題: 無関係なモデルを結合する

あなたのModel1Model2は関連していないと仮定しています。そうでなければ、Django の関連オブジェクトインターフェイスを使用できます。次の 2 つの方法があります。

  1. extraおよび SQL サブクエリを使用します。

    Model1.objects.extra(where = ['field in (SELECT field from myapp_model2 WHERE ...)'])
    

    一部のデータベース (特に MySQL) ではサブクエリがあまり効率的に処理されないため、これはおそらく以下の #2 ほど良くありません。

  2. 生の SQL クエリを使用します。

    Model1.objects.raw('''SELECT * from myapp_model1
                       INNER JOIN myapp_model2
                       ON myapp_model1.field = myapp_model2.field
                       AND ...''')
    

2 番目の問題: 結果の列挙

2 つのアプローチ:

  1. enumerate組み込み関数を使用して、Python でクエリ セットを列挙できます。

    enumerate(Model1.objects.all())
    
  2. この回答で説明されている手法を使用して、MySQL で列挙を行うことができます。このようなもの:

    Model1.objects.raw('''SELECT *, @row := @row + 1 AS row
                       FROM myapp_model1
                       JOIN (SELECT @row := 0) rowtable
                       INNER JOIN myapp_model2
                       ON myapp_model1.field = myapp_model2.field
                       AND ...''')
    
于 2012-10-01T22:55:27.437 に答える