gpt4 book ai didi

django - 如何正确查询一个 list (或另一个ManyToManyField)中所有对象的ManyToManyField?

转载 作者:行者123 更新时间:2023-12-03 14:54:53 26 4
gpt4 key购买 nike

我很困惑构建Django查询的最佳方法,该查询检查ManyToMany字段(或列表)的所有元素是否在另一个ManyToMany字段中。

例如,我有几个Person,他们可以拥有多个专业。人们还可以启动Job,但是他们需要一个或多个Specialty才有资格启动。

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()


这是因为使用 Job.objects.filter(specialty__in=person.specialties.all())将返回与该人的任何专业相匹配的工作,而不是全部。使用此查询,要求唱歌和跳舞的工作将出现在唱歌编码器上,这不是所需的输出。

我希望这个例子不会太复杂。我担心的原因是系统中的Specialties可能会更多,而遍历它们似乎并不是实现此目的的最佳方法。我想知道是否有人可以挠痒痒!

最佳答案

另一个想法

好吧,我想我应该在其他答案中加上这个,但是当我开始研究时,似乎这将是一个不同的方向哈哈

无需迭代:

person_specialties = person.specialties.values_list('pk', flat=True)

non_specialties = Specialties.objects.exclude(pk__in=person_specialties)

jobs = Job.objects.exclude(required_specialties__in=non_specialties)


注意:我不知道这有多快。我的其他建议可能会让您更好。
另外:此代码未经测试

关于django - 如何正确查询一个 list (或另一个ManyToManyField)中所有对象的ManyToManyField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1841931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com