首页 > 解决方案 > Django,在 Case & When 中使用带注释的字段或 SQL 函数

问题描述

我正在尝试进行查询,在该查询中我使用列的平均值与其最新值,然后在 Case 和 When 中使用它。我可以成功注释每月平均和最新字段,但不能在数据库中比较它们:

这是我想做的方向

        latest_known_kpi_obj = KPIs.objects.filter(tag_count__isnull=False, group__id=OuterRef(ID))
        tag_count_of_latest = Subquery(latest_known_kpi_obj.values(ASSIGNED_TAG_COUNT)[:1])
        places_count_of_latest = Subquery(latest_known_kpi_obj.values(PLACES_COUNT)[:1])

        user = self.request.user
        self.kpis = user.user_selected_kpis.get_all_kpis_qs()
        kpis_monthly_averages_annotations = {}
        latest_kpis = {}
        for kpi in self.kpis:
            latest_kpis[f'{kpi.internal_name}_latest'] = Subquery(latest_known_kpi_obj.values(kpi.internal_name)[:1])
            kpis_monthly_averages_annotations[f'{kpi.internal_name}_trend'] = Case(
                When(condition=Avg(f'farm_scores__{kpi.internal_name}',
                                   filter=Q(farm_scores__date__range=month_range)) <
                               (latest_kpis[f'{kpi.internal_name}_latest']), then=1),
                When(Avg(f'farm_scores__{kpi.internal_name}',
                         filter=Q(farm_scores__date__range=month_range)) >
                     (latest_kpis[f'{kpi.internal_name}_latest']), then=-1),
                default=0
            )

query_set = (Group.objects.filter(**filters).
                     annotate(**kpis_monthly_averages_annotations,**latest_kpis)

这是不可能的

'<' not supported between instances of 'Avg' and 'Subquery'

标签: pythonsqldjangodjango-orm

解决方案


推荐阅读