2012-02-28 17 views
-1

update()ではなく、save()メソッドを使用して2つのオブジェクトを更新する必要があります。 モデルをクエリーセットにキャストすることは可能ですか?モデル値に応じてdjangoモデルをクエリセットに/動的関数呼び出しで更新する

objects = Article.objects.all() 
ctype = ContentType.objects.get_for_model(Article) 
objects.update(stats=process_data(F('id'), ctype)) 

process_dataが記事にrelatif他のオブジェクトを取得し、計算後floatを返します:

def process_data(object_id, content_type): 
    counts = Counter.objects.get(content_type=content_type, object_pk=object_id) 
    ... 
    return float(calculation_based_on_counts) 

残念ながら、これは不可能です

は、そうでなければ、私のようなものを試してみました。私はMultipleObjectsReturned例外を取得します:

counter.models.MultipleObjectsReturned:get()が複数返されました - カウンタが15を返しました!検索パラメータは{'object_pk':、 'content_type':}

ありがとうございました!

答えて

0

Fクラスは、コードが期待しているとおり、値を返しません。 Fオブジェクトは式のノードです。

F式は、演算の特定のサブセット、主にブール論理と算術演算のみを許可します。任意の関数ではありません。あなたがフードの下でどのように動作するかに興味があるなら、django/db/models/expressions.pyを見てください。それは可能な限り文書化されていません。

計算がわからなくても、Fで可能かどうかはわかりません。たとえば、関連するオブジェクトの合計を更新する場合は、aggregateupdateを組み合わせて、Fの式を使用します。

+0

私の計算は、私の記事モデルに関連するカウンタモデルに基づいていますが、これはまさに問題です。アグリゲーションはありませんが、関連付けられていないカウンタ値を使用するアルゴリズムなどがあります。集合体を渡すことはできません。とにかくあなたの答えをありがとう! – ScotchAndSoda