【发布时间】:2014-04-04 00:29:45
【问题描述】:
有没有办法查询包含多对多字段的子集或超集?
假设每个人都有一个他们想看的鸟的列表,每个鸟舍都有一个鸟的列表。对于给定的 Person 实例,我如何进行查询以查找该人的列表中有每只鸟 的 Aviaries?同样,对于给定的 Person 实例,我如何找到哪些 Aviaries 在此人的列表中只有只鸟类(但不一定是所有鸟类)。
这是我的 Django 1.5 模型:
class Bird(models.Model):
name = models.CharField(max_length=255, unique=True)
class Aviary(models.Model):
name = models.CharField(max_length=255, unique=True)
birds = models.ManyToManyField(Bird)
class Person(models.Model):
name = models.CharField(max_length=255, unique=True)
birds_to_see = models.ManyToManyField(Bird)
我知道我将如何找到至少有一个人的鸟类的鸟舍,但我不知道我将如何适应这里。 (例如,参见: django queryset for many-to-many field)
如果有一个查询可以执行我想要的操作,我也很想知道是否/为什么更“手动”执行此操作更可取。例如,我可以遍历 aviaries,提取每个 aviary 的鸟类列表,然后查看此人的 bird_to_see 是 aviary 鸟类列表的子集还是超集:
def find_aviaries(self):
person_birds = set(self.birds_to_see.all())
found_aviaries = []
for aviary in Aviary.objects.all():
aviary_birds = set(aviary.birds.all())
if person_birds.issubset(aviary_birds):
found_aviaries.append(aviary)
return found_aviaries
感谢任何帮助!
【问题讨论】:
标签: python django many-to-many django-queryset django-orm