0

したがって、テンプレートビュー用にいくつかのモデルオブジェクトを取得したいのですが、選択したすべての要素の計算ホットネスまたは計算ランキングを事前に呼び出す必要があります。

models = Model.objects.a_bunch_of_filtering_sorting()

それで、これを行うための速い方法は何ですか?
たぶんリストを繰り返しますか?

for model in models: # Surely it can't be this
   model.the_method()

カスタムSQLを実行しようとしましたが、メソッド呼び出しが許可されないか、リストの並べ替えが早すぎます

sortValue = ORDER BY ....
cursor = connection.cursor()
cursor.execute("""
SELECT d.field1, d.field2 ........ 
# unfortunately method calls aren't allowed in here

FROM Model_model d
GROUP BY 1
%s""" % sortValue)

for row in cursor.fetchall():
d = self.model(id=row[0] .... )
d.the_method() # wont work, the list is already 
               # ordered so we are calculating a sorting key one step behind

では、すべてのdjangoモデルでメソッドを呼び出すために実行できる手順は何ですか(最も好ましい方法)。その後、それらを並べ替えてテンプレートにリリースします。

ありがとう

4

2 に答える 2

1

これ

for model in models:
   model.the_method()

あなたはこれを試すことができます

from itertools import imap
from collections import deque
from operator import methodcaller
deque(imap(methodcaller('the_method'), models), maxlen=0)

しかし、それは通常、それほど/はるかに高速ではなく、確かに明確ではありません

于 2012-09-24T05:59:18.940 に答える
0

メソッドthe_methodが新しい SQL を実行し、モデルの数が多い場合、オブジェクトごとにクエリが追加されるため、パフォーマンスが大幅に低下する可能性があります。この場合、必要なすべてのオブジェクトを更新する SQL を 1 つだけ実行するとよいでしょう。the_method新しいクエリを実行しない場合は、ループを使用してもまったく問題ありません。ループはまさにこの目的のために作成されています。

于 2012-09-24T10:03:03.443 に答える