通过第三个表排除多对多关系
我遇到了一个问题,想在有很多对多关系的表中进行“排除”查询,这些表通过一个第三个表连接在一起。我有一个项目表,一个人员表,还有一个关系表,里面有“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))