如何在Django已过滤的ViewSet QuerySet上执行GROUP BY操作
解决方案
要在已过滤的QuerySet上实现按外键topic分组统计,并筛选出所属分组数量达标的CustomerTicket对象,你可以按以下步骤操作:
- 从过滤后的QuerySet中,筛选出满足"关联ticket数量≥指定值"的
topicID集合 - 用这个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
相关产品推荐
相关产品推荐

