Django QuerySet使用order_by导致聚合结果拆分的问题求助
Django QuerySet聚合排序避免分组拆分的解决方案
问题根源在于你用了order_by('-quantity'),这里的quantity是OrderedProduct表的原始字段,不是你聚合生成的qty别名。Django的QuerySet规则是:如果order_by中包含了不在values指定分组字段里的字段,会自动把这个字段加入分组依据,直接导致原本按product__product_name合并的结果被拆分。
解决方法很简单,把排序字段改成聚合后的别名qty即可,同时保持values在前、annotate在后的顺序(这个顺序决定了分组的依据是values里的字段):
top_10_ordered_products = OrderedProduct.objects.filter( order__in=current_month_orders, vendor=vendor ).values('product__product_name').annotate( qty=Sum('quantity') ).order_by('-qty')[:10]
这样排序时基于的是每个产品的总销量qty,不会引入原始字段干扰分组,就能保留按产品名称合并的聚合结果,同时按销量从高到低排序,最后用[:10]直接取出销量前十的产品。
内容的提问来源于stack exchange,提问作者RMCode
相关产品推荐
相关产品推荐

