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

bogh5gae  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(148)

我正在尝试建立求职者匹配系统。
我想按职务所需的关键技能筛选候选人。每个候选人都有多种技能。每个工作都有多个“必需的”工作技能,这是一个模型,也包含了技能的重要性。
我想筛选我的候选人,并只得到候选人如何拥有所有的关键技能所需的工作。关键技能定义为重要性= 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)

我会很感激任何帮助与此!!
谢谢你

xkrw2x1b

xkrw2x1b1#

您可以简单地按照“生成多值关系”链接过滤器,当生成过滤器中的多值关系时,我们限制每个过滤器的相关模型。因此,您可以执行以下操作:

relevant_candidates = Candidate.objects.all()

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

注意:随着关键技能数量的增加,会产生越来越多的连接,导致查询变得越来越复杂,结果会很慢。
注意:与其使用ManyToManyFieldJobSkill表(该表只有Skill的外键和importance字段),不如使用ManyToManyFieldSkill,并使用自定义直通模型(该模型将同时具有JobSkill的外键和importance字段)。请参阅多对多关系的附加字段

相关问题