Django反向查询多对多关系:按Product的added字段筛选Category获取热门分类
Django 热门分类查询实现方案
热门分类的通用判定逻辑为指定时间范围内新增产品数量越高,分类热度越高,可通过Django ORM的聚合查询实现,步骤如下:
1. 依赖导入
首先导入需要的工具类:
from django.db.models import Count, Q from django.utils import timezone from datetime import timedelta
2. 基础查询实现(仅返回有新增产品的分类)
以查询最近7天的热门分类为例:
# 设定时间范围:7天前的时间点 time_threshold = timezone.now() - timedelta(days=7) # 查询逻辑:筛选符合条件的分类,按新增产品数倒序排列 hot_categories = Category.objects.filter( # 跨多对多关联查询,筛选关联产品的创建时间在指定范围内的分类 products__added__gte=time_threshold ).annotate( # 给每个分类新增统计字段,统计该分类下符合条件的新增产品数量 recent_product_num=Count("products") ).order_by( # 按新增产品数降序排序,数值越大热度越高 "-recent_product_num" ) # 可按需截取前N个热门分类,比如前10个 # hot_categories = hot_categories[:10]
3. 扩展查询实现(返回全部分类)
如果需要返回所有分类,只是把无近期新增产品的分类排在末尾,可将筛选条件放到聚合函数内:
time_threshold = timezone.now() - timedelta(days=7) hot_categories = Category.objects.annotate( recent_product_num=Count( "products", filter=Q(products__added__gte=time_threshold) ) ).order_by("-recent_product_num")
该写法下无近期新增产品的分类recent_product_num值为0,会自动排在结果末尾。
内容的提问来源于stack exchange,提问作者Brian Obot
相关产品推荐
相关产品推荐

