2016-12-20 4 views
1

Ich habe data Format wie folgt zusammensetzen:django Verwendung Fall, wenn SQL-Abfrage

[ 
{ 
    "name":"abc", 
    "number":120, 
    "total":500 
}, 
{ 
    "name":"def", 
    "number":30, 
    "total":400 
} 

]

und ich habe eine django Abfragelogik wie folgt aus:

Table.objects.update(
     number = Case(
      When(name=data[0]['name'], then=Value(data[0]['number'])), 
      When(name=data[1]['name'], then=Value(data[1]['number'])), 
      When(name=data[2]['name'], then = Value(data[2]['number'])), 
      ... 
      When(name=data[499]['name'], then = Value(data[499]['number'])), 
      default=F('number'), 
    ) 
) 

Ich möchte Verwenden Sie Code, um die When Teil

zu generieren, damit ich Listen Comprehenti auf sich zu erzeugen, und dann ','.join(query_list) verwenden, um den Halter []
Aber hier ist Problem zu beseitigen: Es wird gesagt TypeError: sequence item 0: expected string, When found

ich es in einem String konvertieren kann nicht, weil When(name=data[499]['name'], then = Value(data[499]['number']) ein Objekt sein sollte. Wie kann ich das beheben?

query_list = [When(name=data[i]['name'], then=Value(data[i]['number'])) for i,item in enumerate(data)] 

part_of_sql= ','.join(query_list) 
print(part_of_sql) 


Table.objects.update(
    number=Case(
    part_of_sql, 
    default=F('number'), 
    ) 
) 

Antwort

2

Versuchen query_list auspacken, wenn es um Case mit * Syntax vorbei:

Case(*query_list, default=F('number') 
+0

Danke, es funktioniert 'Table.objects.update (Anzahl = Fall (default = F ('number'), * query_list)) ' – user2492364