You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django已过滤的ViewSet QuerySet上执行GROUP BY操作

解决方案

要在已过滤的QuerySet上实现按外键topic分组统计,并筛选出所属分组数量达标的CustomerTicket对象,你可以按以下步骤操作:

  1. 从过滤后的QuerySet中,筛选出满足"关联ticket数量≥指定值"的topic ID集合
  2. 用这个ID集合过滤原QuerySet,保留属于这些topic的所有ticket

修改后的filter_queryset方法代码如下:

def filter_queryset(self, queryset):
    queryset = super().filter_queryset(queryset)

    tr2smp_param = self.request.GET.get('tickets_related_to_same_topic_gte')
    if self.action == "list" and tr2smp_param:
        try:
            tr2smp = int(tr2smp_param)
            # 从已过滤的queryset中分组统计,筛选出符合数量要求的topic ID
            valid_topic_ids = queryset.values('topic')\
                .annotate(ticket_count=Count('id'))\
                .filter(ticket_count__gte=tr2smp)\
                .values_list('topic', flat=True)
            
            # 用符合条件的topic ID过滤原queryset
            queryset = queryset.filter(topic__in=valid_topic_ids)
        except ValueError:
            # 处理参数不是有效整数的情况,可根据需求调整逻辑(比如忽略该参数)
            pass
    return queryset

代码说明

  • 用values('topic')按外键分组,annotate(ticket_count=Count('id'))统计每组的ticket数量(用id计数比topic更准确,避免null值干扰)
  • 通过filter(ticket_count__gte=tr2smp)筛选出数量达标的分组,再用values_list('topic', flat=True)提取这些topic的ID列表
  • 最后用filter(topic__in=valid_topic_ids)过滤原QuerySet,得到所有属于达标topic的ticket对象

内容的提问来源于stack exchange,提问作者Igor Atsberger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:30:52