2017-03-16 1 views
0

Je dois renommer le nom du champ de sortie avec la valeur de la variable entrante. Il y a une fonction:Nom du champ dynamique dans l'annotation de l'ensemble de queues

def metric_data(request, test_id, metric): 
    metric_name = metric 
    data = ServerMonitoringData.objects. \ 
     filter(test_id=test_id). \ 
     annotate(timestamp=RawSQL("((data->>%s)::timestamp)", ('timestamp',))).\ 
     annotate(metric=RawSQL("((data->>%s)::numeric)", (metric,))). \ 
     values('timestamp', "metric") 

Donc dans ce cas, peu importe quelle valeur est la variable métrique la sortie est Ressemblant:

{"timestamp": "0:31:02", "metric": "8.82414500398"} 

je dois avoir une sortie avec des noms clés égale à la variable métrique (si métrique 'CPU_iowait' ==):

{"timestamp": "0:31:02", "CPU_iowait": "8.82414500398"} 

tryed utiliser quelque chose comme ceci:

metric_name = metric 
... 
    annotate(metric_name=F('metric')).\ 
    values('timestamp', metric_name) 

Mais il essaie de trouver la colonne 'CPU_iowait' quand existe 'metric_name'. Alors, est-il possible de transmettre le nom du champ en tant que variable?

Répondre

1
# use dict to map the metric's name to a RawSQL query 
# and pass it as keyword argument to `.annotate`. 
metric_mapping = { 
    metric: RawSQL("((data->>%s)::numeric)", (metric,)) 
} 
queryset.annoate(**metric_mapping) 
+0

cool, ça marche, merci – v0devil