Django - 在 ManyToMany 字段上按多个值(逻辑 AND)过滤



我正在尝试建立求职者匹配系统。

我想按工作所需的关键技能过滤候选人。 每个候选人都有多种技能。 每个工作都有多个"必需"的工作技能,这是一个也包含技能重要性的模型。

我想过滤我的候选人,只让候选人具备工作所需的所有关键技能。 关键技能定义为重要性 = 3 的工作技能。

对于给定的工作"job_1",我想获得以下相关候选人:

critical_skills = job_1.required_skills.filter(importance=3)
relevant_candidates = Candidate.objects.filter('candidate how has all the critical_skills)

models.py:

class Skill(models.Model):
title = models.CharField(max_length=100, blank=False, unique=True)
class JobSkill(models.Model):
skill = models.ForeignKey(Skill, on_delete=models.CASCADE)
class Importance(models.IntegerChoices):
HIGH = 3
MEDIUM = 2
LOW = 1
importance = models.IntegerField(choices=Importance.choices)

class Job(models.Model):
title = models.CharField(max_length=100, null=False)
required_skills = models.ManyToManyField(JobSkill, blank=True)
date_posted = models.DateTimeField(default=timezone.now) 
author = models.ForeignKey(User, on_delete=models.CASCADE)  

class Candidate(models.Model):
title = models.CharField(max_length=100, blank=False, null=False)
full_name = models.CharField(max_length=100, blank=False, null=False)
skills = models.ManyToManyField(Skill, blank=True)

我将不胜感激任何帮助!!

谢谢

您可以按照跨越多值关系简单地链接筛选器,当在筛选器中跨越多值关系时,我们会使用每个筛选器限制相关模型。因此,您可以执行以下操作:

relevant_candidates = Candidate.objects.all()
for job_skill in critical_skills:
relevant_candidates = relevant_candidates.filter(skills__id=job_skill.skill_id)

注意:随着关键技能数量的增加,这将使越来越多的联接,从而导致查询变得更加复杂 结果会很慢。

注意:与其使用表ManyToManyField,不如JobSkill表只有一个外键Skill和一个字段importance你应该简单地与SkillManyToManyField并具有自定义的直通模型,该模型将具有两者的外键JobSkill和现场importance.请参阅上的额外字段 多对多 关系

最新更新