Django如何筛选所需技能为用户技能子集的Offer查询集
解决方法
要筛选skills_required为指定用户技能子集的Offer,可参考以下两种实现方式:
方法1:反向排除法(推荐,写法简洁)
逻辑核心:排除所有存在「需求技能不在用户技能列表」的Offer,剩余结果即为符合要求的Offer,自动包含无技能要求的Offer(空集是任意集合的子集)。
from django.db.models import Q # 假设当前用户实例为user_profile user_skills = user_profile.skills.all() qualified_offers = Offer.objects.exclude( ~Q(skills_required__in=user_skills) ).distinct()
方法2:计数匹配法(可读性高,可拓展性强)
逻辑核心:分别统计每个Offer的总需求技能数、和用户技能匹配的需求技能数,二者相等即说明需求技能是用户技能的子集。
from django.db.models import Count, Q, F user_skills = user_profile.skills.all() qualified_offers = Offer.objects.annotate( total_required = Count('skills_required'), matched_skills = Count('skills_required', filter=Q(skills_required__in=user_skills)) ).filter(total_required = F('matched_skills'))
注意事项
- 方法1使用
distinct()是为了避免多对多关联查询产生的重复Offer记录 - 两种方法都天然支持无技能要求的Offer筛选,符合
skills_required设置blank=True的场景 - 数据量较大时推荐优先使用方法1,查询性能更优
内容的提问来源于stack exchange,提问作者Ali Javan
相关产品推荐
相关产品推荐

