Django ORM中Case/When匹配不全致技能匹配百分比错误的解决
解决Django ORM统计技能匹配数只算首个匹配的问题
问题原因
你当前用Count(Case(...), distinct=True)统计匹配技能数时,所有符合条件的技能都会返回1,而distinct=True会把这些重复的1去重,最终只统计到1次匹配,这就是Java岗位明明有3个匹配技能却只算出25%的原因。
解决方案
把统计方式从Count换成Sum,因为Sum会累加每个匹配项返回的1,从而得到真实的匹配技能数量:
修改后的核心代码
.annotate( skills=ArrayAgg("job_vacancy__roles__skills__skill_ref", distinct=True), count_job_skills=Count("job_vacancy__roles__skills__skill_ref", distinct=True), matched_skills_count=Sum( Case( When(job_vacancy__roles__skills__skill_ref__in=user_skills, then=1, default=0), output_field=IntegerField() ), distinct=True # 若岗位技能存在重复关联,保留该参数去重;若无重复可移除 ), )
关键改动说明
- 替换
Count为Sum:Sum会将每个匹配技能对应的1累加,而非像Count那样对结果去重计数。 - 添加
default=0:明确指定不匹配的技能返回0,避免NULL值影响求和结果(可选,但代码更严谨)。 - 保留
distinct=True(按需):如果岗位技能通过多对多关联产生了重复行,该参数会确保每个技能只被统计一次,和count_job_skills的统计逻辑保持一致。
验证效果
修改后Java岗位的matched_skills_count会变为3,matched_percentage计算为3*100/4=75%,符合预期。
内容的提问来源于stack exchange,提问作者Omnia Osman
相关产品推荐
相关产品推荐

