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

Django获取去重产品标题及对应最高最低价格的实现问题

实现方法

你需要的是按产品标题分组做聚合统计,无需使用distinct,直接用Django ORM的分组聚合逻辑即可实现,有两种常用实现方案:

方案1:直接基于Product模型查询

先导入依赖的函数:

from django.db.models import Max, Min

查询语句如下:

product_price_ranges = Product.objects.filter(is_deleted=False) \
    .values('title_id', 'title__title') \
    .annotate(
        max_price=Max('price'),
        min_price=Min('price')
    ) \
    .order_by('title__title')

返回结果为字典列表,每个字典包含标题ID、标题文本、对应最高价格、最低价格,示例结构:

[
    {'title_id': 1, 'title__title': '橙子', 'max_price': 19.9, 'min_price': 8.9},
    {'title_id': 2, 'title__title': '苹果', 'max_price': 29.9, 'min_price': 12.9}
]

方案2:基于ProductTitle模型反向查询

如果需要拿到ProductTitle的完整实例,可使用反向关联查询,导入额外依赖:

from django.db.models import Max, Min, Q

查询语句如下:

title_price_ranges = ProductTitle.objects.annotate(
    max_price=Max('product_title__price', filter=Q(product_title__is_deleted=False)),
    min_price=Min('product_title__price', filter=Q(product_title__is_deleted=False))
).filter(product_title__isnull=False, max_price__isnull=False)

返回结果为ProductTitle实例的查询集,每个实例会额外携带max_price和min_price属性,可直接访问实例的其他字段。

报错原因说明

你之前的报错是因为Django ORM本身不支持带指定字段的distinct与annotate组合使用,且你的需求用分组聚合即可天然实现按标题去重的效果,完全不需要使用distinct。


内容的提问来源于stack exchange,提问作者Gaurab Dawadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:57:04