我对构建Django查询的最佳方法感到困惑,该查询检查字段(或列表)的所有元素ManyToMany是否存在于另一个ManyToMany字段中.
举个例子,我有几个Person,可以有多个专业.也有Jobs表示人们就可以开始,但他们需要一个或多个Specialtys到有资格被启动.
class Person(models.Model):
name = models.CharField()
specialties = models.ManyToManyField('Specialty')
class Specialty(models.Model):
name = models.CharField()
class Job(models.Model):
required_specialties = models.ManyToManyField('Specialty')
Run Code Online (Sandbox Code Playgroud)
一个人只有拥有工作所需的所有专业,才能开始工作.所以,再举一个例子,我们有三个专长:
我有一个Job需要唱歌和舞蹈的专业.有歌唱和舞蹈专业的人可以开始,但另一个有编码和歌唱专业的人不能 - 因为工作需要一个可以唱歌和跳舞的人.
所以,现在我需要一种方法来找到一个人可以承担的所有工作.这是我解决问题的方法,但我确信这是一种更优雅的方法:
def jobs_that_person_can_start(person):
# we start with all jobs
jobs = Job.objects.all()
# find all specialties that this person does not have
specialties_not_in_person = Specialty.objects.exclude(name__in=[s.name for s in person.specialties])
# and exclude jobs that require …Run Code Online (Sandbox Code Playgroud)