2016-05-10 16 views
1

変数をフィルタのキー値として使用しようとしています。すべての変数は、私が望む正確な値を取るが、私はこのエラーが発生します。ここでの私の見解は以下のとおりです。Django Mysql Complexアノテーションにエイリアスが必要です

@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

notureここにエラーが表示されますか? – Barry

+0

@Barryエラーを追加しました。 – hco

答えて

0

ここに複雑な注釈があります。

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

このORMクエリは、group by句を含むSQLクエリに変換されます。通常、ORMは、いずれかのキーでグループ化し、values[0]フィールド(それが何であれ)に集約します。しかし、他のフィールドはどうですか?latitudelongitudeなど?グループ化や集計がないため、クエリパーサーが混乱します。

このクエリについて少し考えてみると、特定の列でグループ化している間にlong_call_idをフェッチしても意味がありません。 (以前の5.7.6へ)のMySQLの古いバージョンは

0

ををchう陰事実は私は私の誤りを発見し、それは悪い間違いだった:

作業コードは、以下の通りです:

report_data = SiteData.objects.using('teldata').filter(**kwargs).values(
      'latitude', 'longitude', 'latt_call_id', 'long_call_id', groups[0]).annotate(Avg(values[0])) 

「緯度」 、 '経度'、 'latt_call_id'、 'long_call_id'はすべてのインスタンスで値の部分にある必要があります。

関連する問題