查询ManyToMany关系

时间:2017-10-09 12:10:28

标签: django django-models

我有一堆属于小组的电台。每个站可以分为多个组。这是模型(简化):

class Station(models.Model):
    name = models.CharField(max_length=4, blank=False, primary_key=True)

    def __str__(self):
        return "Station " + self.name



class StationGroup(models.Model):
    name = models.CharField(max_length=100, blank=False, primary_key=True)
    stations = models.ManyToManyField(Station)

    def __str__(self):
        return "Station group " + self.name

如何获取包含

的列表/查询集
  1. 不在任何组中的电台
  2. N组中的电台
  3. N stationGroups的交集,并集和差异
  4. (欢迎提出更好的问题标题的建议)

2 个答案:

答案 0 :(得分:2)

不在任何群组中:

Station.objects.filter(stationgroup=None)

在N组中:

Station.objects.annotate(group_count=Count('stationgroup')).filter(group_count=N)

交叉/差异 - 没有任何内置方法可以做到这一点。一种可能性是简单地查询组,将它们转换为集合并在Python中进行比较。或者,您可以编写自定义query expressions来执行您想要的操作。

答案 1 :(得分:1)

要添加丹尼尔的回答,要获取任何群组列表中的对象,您可以

Station.objects.filter(stationgroup=g1).filter(stationgroup=g2).filter(stationgroup=g3)

Docs Here