不使用distinct方法筛选Django模型:SQLite下获取品牌唯一产品
解决SQLite下Django获取品牌唯一产品对象的问题
因为SQLite不支持Django的distinct('field')语法(该特性仅PostgreSQL支持),可以用以下几种方式实现需求:
方法一:先获取唯一品牌再逐个取产品
适合数据量不大的场景,逻辑简单直观:
- 先查询所有不重复的品牌名称:
unique_brands = Product.objects.values_list('brand', flat=True).distinct() - 遍历每个品牌,取该品牌下的任意一个产品(这里取第一个):
products = [Product.objects.filter(brand=brand).first() for brand in unique_brands]
缺点是品牌数量较多时会触发多次数据库查询,性能稍差。
方法二:用子查询(Subquery)实现单次查询
适合数据量大的场景,仅需一次数据库请求,Django 1.11及以上版本支持:
先导入所需模块:
from django.db.models import Subquery, OuterRef, F
然后构造查询,这里以获取每个品牌最新(ID最大)的产品为例:
# 子查询:获取当前品牌下ID最大的产品ID latest_product_subquery = Product.objects.filter(brand=OuterRef('brand')).order_by('-id').values('id')[:1] # 主查询:筛选出每个品牌的最新产品 products = Product.objects.annotate(latest_id=Subquery(latest_product_subquery)).filter(id=F('latest_id'))
如果需要取每个品牌最早的产品,把order_by('-id')改成order_by('id')即可。
方法三:直接使用原生SQL
利用SQLite的GROUP BY特性,编写原生SQL查询:
products = Product.objects.raw('SELECT * FROM your_app_product GROUP BY brand')
注意替换your_app_product为你实际的表名(默认格式是应用名_模型名全小写)。SQLite在GROUP BY时会返回每个分组的第一行数据,需要确认这个行为符合你的需求。
内容的提问来源于stack exchange,提问作者rastawolf
相关产品推荐
相关产品推荐

