2016-09-24 8 views
0

Djangoに辞書があり、モデルのキーといくつかの値が含まれています。私はこのモデルのフィールド(スコア)を次のように更新したいと考えています。 定数にすべてのレコードのそのフィールドを掛けて、レコードが辞書に見つかった場合は対応するdict値をフィールドに追加します。多くのレコードがあり、各オブジェクトを取得して保存するのに時間がかかります。私は、この更新クエリを試してみましたが、それが動作していません。辞書の値に基づいてDjangoのモデルを更新する

A.objects.update(score=F('score') * CONST + (dictionary[F('key')] if F('key') in dictionary else 0))

問題は、私は、問題をデバッグしようとした条件は、レコードのすべてのために偽のようだということであり、それはそうですF('key') doesnの」目的の値(文字列)を持っていません。詳細については

、この行は正しい結果があります。

a = A.objects.get(key='key1') a.score * CONST + (dictionary[a.key] if a.key in dictionary else 0)

答えて

2

をここは辞書ルックアップを使用しても意味がありません。これは単一のSQLクエリに変換されます.F()の値はPythonでは解決されないため、辞書で検索する方法はありません。

おそらくconditional expressionを使用する必要があります。

+0

条件式を使用してクエリのフィールド値によって辞書値を検索する方法についてはわかりません... @ daniel-roseman – Armita

+0

辞書を使用することはできません。代わりに、さまざまな条件を記入してください。この場合は不可能な –

+0

です。ご協力いただきありがとうございます。 – Armita

0

@ダニエル・ローズマンの答えから借用すると、条件式を使うことができます。一般的なやり方でそれを使うことができます。私はちょうどそれを自分でやった。

まず、Case式で使用されるWhen式のリストを生成します。

when_criteria = [When(key=key, then=value) for key, value in dictionary.items()] 

私たちは、この場合には、関数に渡すことができる引数、Caseのリストにリストを展開するために、Pythonの*演算子を使用します。確かに

A.objects.update(score=F('score') * CONST + Case(*when_criteria, 
default=0) 

、私は更新方法でこれをしようとしなかったが、それは、注釈で動作ありません。

関連する問題