Django Mysql复杂注释需要别名

2024-06-29 01:04:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用变量作为筛选键值。所有变量都取我想要的精确值,但是我得到了这个错误。以下是我的观点:

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

错误日志如下:

^{pr2}$

我主要想添加一个动态过滤器,可以根据请求参数进行更改。如果你有其他建议,我也会打开它。谢谢


Tags: reportiddatalenobjectscallquerykwargs
2条回答

我发现了我的错误,这是一个严重的错误:

工作代码如下:

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

“纬度”、“经度”、“纬度”、“经度”、“经度”、“经度”、“经度”应该在所有实例中的值部分中。在

这是你复杂的注解。在

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

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

如果您花点时间考虑一下这个查询,您将认识到在对特定列分组时获取long_call_id实际上没有任何意义。mysql的旧版本(5.7.6之前的版本)将

相关问题 更多 >