我有一个应用程序匹配候选人(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:)
1条答案
按热度按时间vojdkbi01#
“我想避免必须迭代每个候选项以将其从列表中删除,而只需使用filter(Q())之类的东西”
那么做一件这样的事情怎么样:
此函数接受一个候选人查询集和一个职位的强制语言ID列表,并返回至少掌握所有强制语言的候选人的筛选查询集。
像这样,你可以过滤掉你的候选对象,而不用在for循环中解析它们。