2017-04-27 1 views
0

Ich hatte eine riesige Registrierungstabelle mit 112 Feldern. Für eine bestimmte Suche möchte ich 17 Felder vergleichen & Farben zuweisen Variable sagen 'clrSelected'. Mein Code ist:Django 1.4 - Abfrage Iteration mit in einem Wörterbuch gespeicherten Feldern

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

wird es nur eine wenn Zustand sein, die gefärbt werden müssen. Dies bedeutet, dass sich das zu vergleichende Feld (aus dem Wörterbuch) basierend auf der Benutzerauswahl ändert. Ich möchte aus einem Wörterbuch den Feldnamen wie diese und es so etwas wie dieses

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

verwenden

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

zuzugreifen Wie ich oben die Felder nutzen könnten. Ich bin mit django 1.4 & Python 2.7

+0

ist Ihre Frage: "Wie kann ich dynamisch auf Felder von Variablennamen zugreifen?"? Gibt es einen Grund, warum Sie ein Wörterbuch als Struktur verwenden, um die Feldnamen statt einer Liste zu speichern? – ChidG

+0

yup..ich möchte dynamisch auf ein Feld aus dem Wörterbuch zugreifen. Das Feld für den Zugriff hängt von der Benutzerauswahl ab. – user123

+1

Wie die Antwort sagt, verwenden Sie "getattr", um dynamisch auf das Feld zuzugreifen. Sie brauchen kein Wörterbuch. Eine Liste hier würde genauso gut funktionieren. – ChidG

Antwort

1

einfach die Frage zu beantworten, könnten Sie getattr verwenden:

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

Aber ich bin mir ziemlich sicher, dass Sie mit einer anderen Art der Implementierung gehen könnten in Dieser Fall, der keine dict wie folgt erfordert.

würde ich vorschlagen, eine drei Tupel Liste: (Feldname, den Wert, Farbe)

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

Und dann diese Liste verwenden, um die Farbe zu bestimmen:

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

bei der Implementierung der Suche, es scheint, dass die Farbe auf dem letzten if Zustand basiert, der übereinstimmt. Wenn dies der Fall ist, können Sie some_list in umgekehrter Reihenfolge und break auf der ersten übereinstimmenden Bedingung erstellen.

+0

thnk u..gib mich mit getattr. Außerdem gibt es nur eine ** ** if ** Bedingung in meinem Code, basierend auf dem Feld, das gefärbt werden muss (Benutzerauswahl), ich werde die Frage bearbeiten. – user123