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

标签 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 中注册但在他注册的任何 项目中状态=red 的所有人。有没有办法将第二个条件与第一个条件联系起来?

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

最佳答案

也许是这个? (未经测试)

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

关于python - 通过第三个表排除多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1724317/

相关文章:

python - 将 Matrix 市场矩阵转换为 pandas 数据框 python

python - Django 在 DateField 的 auto_now_add 中使用哪个时区?

java - JPA 多对多

mysql - 多对多数据库建模问题

forms - Symfony2 Doctrine2 多对多形式不保存实体

在评估匹配的字符串时执行类似 Ruby 的正则表达式替换的 Pythonic 方法

python - 如何在 Python 中创建一组集合?

javascript - 访问不需要登录的网站时CSRF检查失败是什么意思?

python - 如何从 Python smtp 调试服务器捕获输出

python - 无法在 django 中使用电子邮件登录