是否可以通过检查交集是否为空来过滤 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()
)
做一个关于创建 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()
)