Django中如何用Group by或distinct去除name列重复的数据行?
解决方案
你的需求是按name列去重,保留每个name对应的最早(ID最小)的记录,以下是两种可行的实现方式:
方法一:通过聚合获取最小ID再过滤(兼容所有数据库)
这种方法不受数据库类型限制,逻辑清晰:
- 先通过
annotate和Min聚合函数,获取每个name对应的最小ID; - 用这些ID过滤出最终的去重记录。
代码示例:
from django.db.models import Min # 第一步:获取每个name对应的最小ID集合 min_id_list = MyModel.objects.values('name').annotate(min_id=Min('id')).values_list('min_id', flat=True) # 第二步:筛选出这些ID对应的记录,按ID排序 unique_records = MyModel.objects.filter(id__in=min_id_list).order_by('id')
方法二:使用distinct配合order_by(仅PostgreSQL支持)
如果你的项目使用PostgreSQL数据库,可以利用Django的distinct(*fields)特性,配合order_by直接获取去重结果:
# 按name分组,保留每个name的第一条记录(ID最小的那条) unique_records = MyModel.objects.order_by('name', 'id').distinct('name')
这里order_by('name', 'id')确保每个name下的记录按ID升序排列,distinct('name')会截取每个name分组的第一条记录。
为什么你之前的代码没生效?
你用MyModel.objects.annotate(Count('name'))只是给每一条记录添加了一个额外字段(该name在表中的总条数),并没有对记录进行去重过滤,所以无法得到你想要的结果。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

