我对构建 Django 查询的最佳方法感到困惑,该查询检查字段(或列表)的所有元素ManyToMany
是否存在于另一个ManyToMany
字段中。
举个例子,我有几个Person
s,他们可以拥有多个Specialty。也有Job
人们可以启动的s,但他们需要一个或多个Specialty
s才有资格启动。
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')
一个人只有具备工作所需的所有专业才能开始工作。因此,再次举个例子,我们有三个专业:
- 编码
- 唱歌
- 跳舞
我有一个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 them
for s in specialties_not_in_person:
jobs = jobs.exclude(specialty=s)
# the ones left should fill the criteria
return jobs.distinct()
这是因为 using将返回与该人的任何Job.objects.filter(specialty__in=person.specialties.all())
专长相匹配的工作,而不是所有专长。使用此查询,需要 Singing and Dancing 的工作将出现在唱歌的编码员中,这不是所需的输出。
I'm hoping this example is not too convoluted. The reason I'm concerned about this is that the Specialties in the system will probably be a lot more, and looping over them doesn't seem like the best way to achieve this. I'm wondering if anyone could lend a scratch to this itch!