通过第三个表排除多对多关系

时间:2009-11-12 18:22:18

标签: python django many-to-many

我在通过第三个表与多对多关系的表上进行“排除”查询时遇到问题。我有一个带有项目的表,一个带有人的表和一个带有标志“is_green,is_yellow,is_red”的关系表,如:

class Project(models.Model):
    ...

class Person(models.Model):
    projects = models.ManyToManyField(Project, through='Status')

class Status(models.Model):
    person = models.ForeignKey(Person)
    project = models.ForeignKey(Project)
    is_green = models.BooleanField()
    ...

现在我想查询返回所有人,不包括那些在特定项目中有标记“is_red”的人。但是以下

Person.objects.exclude(project=p, status__is_red=True)

排除在项目 p 注册的所有人,但对于他注册的项目,状态=红色。有没有办法将第二个条件与第一个条件联系起来?

我的方法是直接过滤Status表,当然这是有效的。但是我确实有一个“状态”对象列表而不是“人物”对象。

2 个答案:

答案 0 :(得分:4)

也许这个? (另)

Person.objects.exclude(id__in=Person.objects.filter(project=p, status__is_red=True).values(id))

答案 1 :(得分:0)

如果您有名为“对象”的状态对象列表,则可以使用

[s.person for s in objects]

将其变成相应人员的列表。