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

Django中如何用Group by或distinct去除name列重复的数据行?

解决方案

你的需求是按name列去重,保留每个name对应的最早(ID最小)的记录,以下是两种可行的实现方式:

方法一:通过聚合获取最小ID再过滤(兼容所有数据库)

这种方法不受数据库类型限制,逻辑清晰:

  1. 先通过annotate和Min聚合函数,获取每个name对应的最小ID;
  2. 用这些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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:52:14