queryset注释中的动态字段名称

时间:2017-03-16 10:35:46

标签: python django django-models django-orm

我需要使用传入的变量值重命名输出字段名称。有一个功能:

$s = Get-Content "F:\Path\To\JSON\file.json" -Raw|ConvertFrom-Json
$s.policies.'Framework.DataContext'.connectionString="Server=ServerName;Database=DateBaseName;Integrated Security=sspi2;"
$s|ConvertTo-Json |Set-Content "F:\Path\To\JSON\file.json"

因此,在这种情况下,无论变量 metric 带有什么值,输出看起来都像:

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

我需要输出一个键名等于公制变量的输出(如果公制==' CPU_iowait'):

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

尝试使用这样的东西:

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

但它正试图找到“CPU_iowait”#39;存在时的列' metric_name'。 那么有没有办法将字段名称作为变量传递?

1 个答案:

答案 0 :(得分:3)

# 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.annotate(**metric_mapping)