2017-03-16 50 views
0

我需要使用傳入變量值重命名輸出字段名稱。還有一個功能:queryset註釋中的動態字段名稱

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") 

因此,在這種情況下,不管是什麼值帶有可變指標輸出看起來像:

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

我需要有一個鍵名的輸出等於指標變量(如果指標== 'CPU_iowait'):

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

Tryed使用這樣的事情:

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

但它試圖找到'CPU_iowait'列當存在'metric_name'。 那麼有什麼辦法將字段名稱作爲變量傳遞?

回答

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

很酷,有效,謝謝 – v0devil