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
相关产品推荐
相关产品推荐

