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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:06:03