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

不使用distinct方法筛选Django模型:SQLite下获取品牌唯一产品

解决SQLite下Django获取品牌唯一产品对象的问题

因为SQLite不支持Django的distinct('field')语法(该特性仅PostgreSQL支持),可以用以下几种方式实现需求:

方法一:先获取唯一品牌再逐个取产品

适合数据量不大的场景,逻辑简单直观:

  1. 先查询所有不重复的品牌名称:
    unique_brands = Product.objects.values_list('brand', flat=True).distinct()
    
  2. 遍历每个品牌,取该品牌下的任意一个产品(这里取第一个):
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:55:32