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

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  # 若岗位技能存在重复关联,保留该参数去重;若无重复可移除
    ),
)

关键改动说明

  1. 替换Count为Sum:Sum会将每个匹配技能对应的1累加,而非像Count那样对结果去重计数。
  2. 添加default=0:明确指定不匹配的技能返回0,避免NULL值影响求和结果(可选,但代码更严谨)。
  3. 保留distinct=True(按需):如果岗位技能通过多对多关联产生了重复行,该参数会确保每个技能只被统计一次,和count_job_skills的统计逻辑保持一致。

验证效果

修改后Java岗位的matched_skills_count会变为3,matched_percentage计算为3*100/4=75%,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:50:10