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

