2017-04-27 2 views
0

J'avais une énorme table d'enregistrement avec 112 champs. Pour une recherche particulière, je veux comparer 17 champs & affecter des couleurs à la variable dire 'clrSelected'. Mon code est:Django 1.4 - interroger l'itération en utilisant des champs stockés dans un dictionnaire

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' 
    ... 
    ... 

il n'y aura qu'un seul si condition, qui doivent être de couleur. Ce qui signifie que le champ (du dictionnaire) à comparer changera en fonction de la sélection de l'utilisateur. Je veux accéder au nom du champ dans un dictionnaire comme celui-ci

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

Et utiliser quelque chose comme ça

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

Comment pourrais-je utiliser les champs ci-dessus. J'utilise django 1.4 & python 2.7

+0

est votre question: «comment accéder dynamiquement aux champs à partir de noms de variables? Y at-il une raison pour laquelle vous utilisez un dictionnaire comme structure pour stocker les noms de champs plutôt qu'une liste? – ChidG

+0

yup..je veux accéder dynamiquement à un champ du dictionnaire. le champ d'accès dépend de la sélection de l'utilisateur. – user123

+1

Comme la réponse l'indique, utilisez 'getattr' pour accéder dynamiquement au champ. Vous n'avez pas besoin d'un dictionnaire. Une liste ici fonctionnerait aussi bien. – ChidG

Répondre

1

Juste pour répondre à la question, vous pouvez utiliser getattr:

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

Cependant, je suis sûr que vous pouvez aller avec une sorte de mise en œuvre différente ce cas qui ne nécessite pas l'utilisation d'un dict comme ça.

Je suggère d'utiliser une liste de trois tuple: (fieldName, valeur, couleur)

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

Et puis utiliser cette liste pour déterminer la couleur:

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

En regardant votre mise en œuvre, il semble que la couleur sera basée sur la dernière condition if qui correspond. Si tel est le cas, vous pouvez créer some_list dans l'ordre inverse et break dans la première condition correspondante.

+0

thnk u..lettez-moi essayer getattr. Il y aura aussi une seule condition ** if ** dans mon code, en fonction du champ qui doit être coloré (sélection par l'utilisateur), je vais éditer la question. – user123