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
相关产品推荐
相关产品推荐

