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

Django中distinct连续调用为何无法保留前序筛选结果?

问题分析与解决

你的代码里两次调用distinct()的逻辑和预期不符——Django的distinct()是累积字段的,第二次调用distinct('tree_status__name_en')会把第一次的tree字段也加入去重条件,相当于执行了distinct('tree', 'tree_status__name_en'),所以才会得到3条结果,而非基于第一次去重后的1条数据再做筛选。

要实现「先按tree去重,再基于这个结果按tree_status__name_en去重」的需求,可以分两步处理:

方案一:数据库层面完成两次过滤(适合大数据量)

先提取第一次去重后的tree ID,再用这些ID过滤原表,最后按状态字段去重:

# 第一步:获取所有去重后的tree的ID
unique_tree_ids = AssessmentTaskForm.objects.distinct('tree').values_list('tree_id', flat=True)

# 第二步:基于这些tree的记录,再按tree_status__name_en去重
unique_statuses = AssessmentTaskForm.objects.filter(tree_id__in=unique_tree_ids).distinct('tree_status__name_en')

print(unique_statuses.count())

方案二:内存中处理(适合小数据量)

先把第一次去重后的查询集转为列表(触发数据库查询),再从中提取状态去重:

# 先获取第一次去重后的完整对象列表
unique_trees = list(AssessmentTaskForm.objects.distinct('tree'))

# 从列表中提取所有状态并去重
unique_status_names = {obj.tree_status.name_en for obj in unique_trees}
print(len(unique_status_names))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:29:58