Django Mysql复杂注释需要别名

时间:2016-05-10 17:24:40

标签: python mysql django django-rest-framework

我正在尝试将变量用作过滤器键值。所有变量都采用我想要的精确值,但后来我得到了这个错误。这是我的观点:

@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']

主要是我想添加一个可以根据请求参数更改的动态过滤器。如果你建议任何其他方式我也打开它。感谢

2 个答案:

答案 0 :(得分:0)

这是您的复杂注释。

.annotate(
      'latitude', 'longitude', 'latt_call_id', 'long_call_id'
      ,Avg(values[0]))

此ORM查询将转换为包含group by子句的SQL查询。通常,ORM将按其中一个键进行分组并聚合values[0]字段(无论是什么)。但是其他字段latitudelongitude等等呢?您没有任何分组或聚合,这会混淆查询解析器。

如果您花点时间仔细考虑一下这个查询,您会发现在对特定列进行分组时获取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'应该在所有实例的值部分中。