是否可以通过检查交集是否为空来过滤 Django 多对多查询集字段?

Is it possible to filter django Many-To-Many QuerySet fields by checking if they're intersection is not empty?

做一个关于创建 Django 服务的练习,该服务为特定工作 returns 提供最佳候选人。 当然是机器学习问题,这里的评分算法很简单。 坦率地说,这是我第一次使用 Django,我在从其中一个模型中过滤掉对象时遇到了一些问题。

这是我的模型class:

from django.db import models

class Skill(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self) -> str:
        return f'Skill name: {self.name}'

class Candidate(models.Model):
    title = models.CharField(max_length=100)
    name = models.CharField(max_length=100, default='')
    skills = models.ManyToManyField(Skill)

    def __str__(self) -> str:
        return f'Name: {self.name}, title: {self.title}'

class Job(models.Model):
    title = models.CharField(max_length=100)
    skills = models.ManyToManyField(Skill)

    def __str__(self) -> str:
        return f'title: {self.title}'

给定一个工作名称,我首先想按技能进行过滤,即检查给定的候选人并过滤掉与给定工作没有共同技能的人。在更数学的方法中 - job_skills_set 和 candidate_skills_set 交集不为空。 像这样的东西:(我混合了 Python 语法)

Candidate.objects.filter(len(set.intersection(set(skills), set(job.skills))) > 0)

有什么方法可以在 Django 中做到这一点吗? 尝试了多种方法都没有成功。

提前致谢!

要获得与给定工作共享至少一项技能的所有候选人,您可以通过技能一直跟踪关系 table

Candidate.objects.filter(skills__job=job).distinct()

要获得与工作具有相同技能的求职者,您可以计算匹配项的数量,然后过滤匹配项的数量

from django.db.models import Count
Candidate.objects.filter(
    skills__job=job
).annotate(
    match=Count('skills')
).filter(
    match=job.skills.count()
)