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

3 投票
2 回答
2642 浏览
提问于 2025-04-15 15:57

我遇到了一个问题,想在有很多对多关系的表中进行“排除”查询,这些表通过一个第三个表连接在一起。我有一个项目表,一个人员表,还有一个关系表,里面有“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中注册的人,只要他们在任何项目中有“红色”状态。有没有办法把第二个条件和第一个条件结合起来呢?

我尝试直接在状态表上进行过滤,这当然是可行的。但这样我得到的是“状态”对象的列表,而不是“人员”对象的列表。

2 个回答

0

如果你有一个叫做 'objects' 的状态对象列表,你可以使用

[s.person for s in objects]

把它转换成对应的人员列表。

4

也许这个可以?(还没测试过)

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

撰写回答