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

MySQL环境下Django ORM如何基于指定字段去重并获取其他关联字段

解决方案

MySQL本身不支持PostgreSQL风格的DISTINCT ON(字段)语法,所以你需要调整查询写法,以下是两种可行的实现方式:

方案1:使用ORM分组查询(推荐,无需写原生SQL)

利用MySQL的GROUP BY特性实现按指定字段去重,同组内的非分组字段可以通过annotate取值:

from django.db.models import Max, F

# 按discipline_code和code分组,取每组最新创建的记录的其他字段值
# 如果你用TimeStampedModel有创建时间字段,也可以用Max('created')替代Max('id')判断最新记录
query_results_2 = CourseInfo.objects.filter(discipline_id=指定id)\
    .values('discipline_code', 'code')\
    .annotate(
        latest_id=Max('id'),
        title=F('title'),
        pattern=F('pattern')
    )\
    .values('discipline_code', 'code', 'title', 'pattern')

注意:此写法需要你确认同discipline_code+code组内的title、pattern值都是一致的,不会出现取值歧义;如果字段值可能不同,可以按需把F('title')替换为Max('title')/Min('title')指定取值规则。

方案2:使用原生SQL查询

如果你对SQL更熟悉,也可以直接写原生查询实现需求:

query_results_2 = CourseInfo.objects.raw('''
    SELECT 
        id, discipline_code, code, title, pattern
    FROM 替换为你的表名
    WHERE discipline_id = %s
    GROUP BY discipline_code, code
''', [指定id])

把替换为你的表名修改为CourseInfo模型对应的实际数据库表名即可。

内容的提问来源于stack exchange,提问作者django

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:04