0

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

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

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

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

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

模型.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)

我将不胜感激任何帮助!

谢谢

4

1 回答 1

0

您可以根据Spanning multi-valued Relations 简单地链接过滤器,当在过滤器中跨越多值关系时,我们会限制每个过滤器的相关模型。因此,您可以执行以下操作:

relevant_candidates = Candidate.objects.all()

for job_skill in critical_skills:
    relevant_candidates = result.filter(skills__id=job_skill.skill_id)

注意:随着关键技能数量的增加,这将导致越来越多的连接导致查询变得更加复杂并且结果会非常慢。

注意:与只有一个外键和字段 ManyToManyField的表不同,您应该简单地拥有一个with并有一个自定义的直通模型,该模型对and和字段 都有一个外键 。请参阅多对多关系的额外字段JobSkillSkillimportanceManyToManyFieldSkillJobSkillimportance

于 2021-03-12T14:48:02.950 回答