如何在Django中编写M2M模型上的复杂过滤器查询?

amrnrhlw  于 2023-04-22  发布在  Go
关注(0)|答案(1)|浏览(80)

我有一个应用程序匹配候选人(Candidate)与工作(Job).对于这两个模型,我有一个m2m的关系与语言.一种语言可能需要一个特定的工作.

class JobLanguage(models.Model):

    language = models.ForeignKey(Language, on_delete=models.CASCADE)
    job = models.ForeignKey(Job, related_name='languages', on_delete=models.CASCADE)
    is_mandatory = models.BooleanField(default=False)

而一个候选人说的语言有一定的“精通”水平。

class CandidateLanguage(models.Model):
    language = models.ForeignKey(CandidateComponentLanguage, on_delete=models.CASCADE)
    candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name='languages')
    mastery = models.PositiveSmallIntegerField(blank=True, choices=MasteryLevel.choices, null=True)

现在,在我的匹配算法中,我需要在某个时候根据特定工作所需的语言来筛选候选人。假设我有一个工作的强制语言列表:job_mandatory_languages_ids = [1, 2]。你如何以最有效的方式编写一个方法,只返回至少掌握(意思是mastery=1)这个列表中所有语言的候选人?我想避免迭代每个候选人以将它们从列表中删除,而只是使用类似filter(Q())的方法
这显然是行不通的,但这是我想实现的一个想法。

def filter_on_languages(candidates, job_mandatory_languages_ids):
    return candidates.filter(languages__language__contains=job_mandatory_languages_ids, languages__language__mastery=1)

Thank you:)

vojdkbi0

vojdkbi01#

“我想避免必须迭代每个候选项以将其从列表中删除,而只需使用filter(Q())之类的东西”
那么做一件这样的事情怎么样:

from django.db.models import Q

def filter_on_languages(candidates, job_mandatory_languages_ids):
    q_objects = Q()
    for language_id in job_mandatory_languages_ids:
        q_objects &= Q(languages__language__id=language_id, languages__mastery=1)
    return candidates.filter(q_objects)

此函数接受一个候选人查询集和一个职位的强制语言ID列表,并返回至少掌握所有强制语言的候选人的筛选查询集。
像这样,你可以过滤掉你的候选对象,而不用在for循环中解析它们。

相关问题