2017-04-27 10 views
0

私は112のフィールドを持つ巨大な登録テーブルを持っていました。特定の検索については、私は17フィールドを比較したいと思っています&変数を 'clrSelected'と言う色を割り当てます。 私のコードは次のとおりです。Django 1.4 - 辞書に格納されたフィールドを使用して反復をクエリする

reg = Regisration.objects.filter('some condition').order_by("name") 
for r in reg: 
    if r.name=='abc': clrSelected='#fff' 
    if r.type=='1': clrSelected='#000' 
    if r.appl=='10': clrSelected='#c1ff51' 
    if r.code=='': clrSelected='#60c5f7' 
    if r.qlty=='first': clrSelected='#f99334' 
    ... 
    ... 

着色する必要がある唯一のかの条件があるでしょう。つまり、比較されるフィールド(辞書からのフィールド)は、ユーザーの選択に基づいて変更されます。 私はこの

flds = {'1':'name', '2':'type', '3':'appl', '4':'code', '5':'qlty',...} 

のように辞書からフィールド名をアクセスし、それを私は上記のようにフィールドを使用することができますどのようにこの

if r.flds['1']=='abc': clrSelected='#fff' 

のようなものを使用します。私は質問に答えるためにはDjango 1.4 &のpython 2.7

+0

は、「変数名からフィールドに動的にアクセスする方法は?」リストではなくフィールド名を格納する構造体として辞書を使用する理由はありますか? – ChidG

+0

yup..i辞書からフィールドに動的にアクセスしたい。アクセスするフィールドはユーザーの選択に依存します。 – user123

+1

答えとして、getattrを使ってフィールドに動的にアクセスしてください。あなたは辞書は必要ありません。ここのリストも同様にうまくいくでしょう。 – ChidG

答えて

1

を使用しています、あなたはgetattrを使用することができます。

if getattr(r, flds['1']) == 'abc': clrSelected = '#fff' 

をしかし、私はあなたが、実装の異なる種類の中で行くことができると確信していますこのような場合はdictを使用する必要はありません。

私は3つのタプルのリストを使用することをお勧めします:色を決定するために、このリストを使用し、その後、(fieldNameを、値、色)

some_list = [('name', 'abc', '#fff'), ('type', '1', '#000'), ...] 

をそして:

for fieldName, value, color in some_list: 
    if getattr(r, fieldName) == value: 
     clrSelected = color 

があなたの実装を見てみると、色が最後のifの条件に合っているようです。その場合は、some_listを逆順に作成し、breakを最初の一致条件で作成することができます。

+0

thnk u..let私はgetattrを使ってみます。また、自分のコードに** if if条件が1つしかありません。色を付ける必要のあるフィールド(ユーザー選択)に基づいて、質問を編集します。 – user123

関連する問題