我正在尝试将变量用作过滤器键值。所有变量都采用我想要的精确值,但后来我得到了这个错误。这是我的观点:
@api_view(['POST'])
def map_data(request):
query_id = request.POST.get('queryId', 1)
group_name = request.POST.get('group', 'district')
query = QueryList.objects.using('teldata').get(query_id=query_id)
groups = query.network_element.lower().split(',')
values = query.kpi_val.lower().split(',')
kwargs = {groups[0]: group_name}
if len(values) == 1:
if len(groups) == 1:
report_data = SiteData.objects.using('teldata').values(groups[0]).annotate(
'latitude', 'longitude', 'latt_call_id', 'long_call_id', Avg(values[0])
).filter(**kwargs)
elif len(groups) == 2:
report_data = SiteData.objects.using('teldata').values(groups[0], groups[1]).annotate(
'latitude', 'longitude', 'latt_call_id', 'long_call_id', Avg(values[0])
).filter(**kwargs)
elif len(values) == 2:
if len(groups) == 1:
report_data = SiteData.objects.using('teldata').values(groups[0]).annotate(
'latitude', 'longitude', 'latt_call_id', 'long_call_id', Avg(values[0]), Avg(values[1])
).filter(**kwargs)
elif len(groups) == 2:
report_data = SiteData.objects.using('teldata').values(groups[0], groups[1]).annotate(
'latitude', 'longitude', 'latt_call_id', 'long_call_id', Avg(values[0]), Avg(values[1])
).filter(**kwargs)
return Response(report_data)
错误日志如下:
Complex annotations require an alias
Request Method: POST
Request URL: http://127.0.0.1:5555/data/map-data/
Django Version: 1.9.5
Exception Type: TypeError
Exception Value:
Complex annotations require an alias
Exception Location: /Library/Python/2.7/site-packages/django/db/models/query.py in annotate, line 895
Python Executable: /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Python Version: 2.7.10
Python Path:
['/Users/hco/PycharmProjects/tool/linyit',
'/Applications/PyCharm CE.app/Contents/helpers/pydev',
'/Library/Python/2.7/site-packages/pip-8.1.1-py2.7.egg',
'/Users/hco/PycharmProjects/tool',
'/Applications/PyCharm CE.app/Contents/helpers/pydev',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
'/Library/Python/2.7/site-packages']
主要是我想添加一个可以根据请求参数更改的动态过滤器。如果你建议任何其他方式我也打开它。感谢
答案 0 :(得分:0)
这是您的复杂注释。
.annotate(
'latitude', 'longitude', 'latt_call_id', 'long_call_id'
,Avg(values[0]))
此ORM查询将转换为包含group by子句的SQL查询。通常,ORM将按其中一个键进行分组并聚合values[0]
字段(无论是什么)。但是其他字段latitude
,longitude
等等呢?您没有任何分组或聚合,这会混淆查询解析器。
如果您花点时间仔细考虑一下这个查询,您会发现在对特定列进行分组时获取long_call_id
并没有任何意义。 Y实际上,mysql的旧版本(5.7.6之前的版本)将是
答案 1 :(得分:0)
我发现了我的错误,这是一个错误的错误:
工作代码如下:
report_data = SiteData.objects.using('teldata').filter(**kwargs).values(
'latitude', 'longitude', 'latt_call_id', 'long_call_id', groups[0]).annotate(Avg(values[0]))
'latitude','longitude','latt_call_id','long_call_id'应该在所有实例的值部分中。