如何查询最常用的商品分类并能否通过单条Django ORM查询实现(保持原有排序规则)
如何查询最常用的商品分类并能否通过单条Django ORM查询实现(保持原有排序规则)
嘿,当然可以用单条Django ORM查询搞定你的需求,还能完美保留你要求的排序规则!
先理清楚你原来的逻辑:先是筛选出标题包含指定关键词的商品,按照-is_featured、rank、-created的规则排序,接着从这些商品里统计出出现次数最多的分类。现在我们可以把这两步合并成一次数据库查询,既高效又能保证逻辑完全一致。
直接上合并后的代码:
most_used_category = Product.objects.filter( title__icontains=self.query ).annotate( category_count=Count('category_id') ).order_by('-category_count', '-is_featured', 'rank', '-created').values( 'category_id', 'category_count' ).first()
逻辑说明:
- 保留了你原来的
title__icontains筛选条件,确保统计的是符合搜索要求的商品集合 - 直接在筛选后的QuerySet上用
annotate统计每个分类下的商品数量,命名为category_count - 排序时优先按
-category_count(分类商品数倒序)确保最常用的分类排在第一位,同时保留了你原来的-is_featured、rank、-created规则作为次要排序(如果有多个分类商品数相同,会按你原来的规则确定顺序) - 最后用
values指定返回字段,first()直接拿到结果集中的第一条,也就是你要的最常用分类
如果你担心原来的商品排序规则会影响统计结果,完全不用——分类计数是基于所有符合筛选条件的商品,和商品的展示顺序无关,合并后的查询和你原来两次查询的结果完全一致,但只需要和数据库交互一次,性能更优。
备注:内容来源于stack exchange,提问作者Nodirkhuja Khamitov
相关产品推荐
相关产品推荐

