Django ManyToManyField排除

时间:2017-05-28 20:42:10

标签: python django django-models

我对Django很新,大部分时间都是C人(嵌入式/ Linux),所以我为自己的无知而道歉。我试过这个确切的查询而没有运气。

我有两个模型,每个模型都有一个指向相同第三个模型的多对多字段。第三种模式代表了某种限制。

class Restriction(models.Model):
    ...

class ClassA(models.Model):
    ...
    restrictions = models.ManyToManyField(Restriction)

class ClassB(models.Model):
    ...
    restrictions = models.ManyToManyField(Restriction)

我预计会有一个ClassA实例(称之为object_a)。我想找到所有包含object_a中任何限制的ClassB实例。它看起来像这样:

class ClassA(models.Model):
    ...
    restrictions = models.ManyToManyField(Restriction)

    def get_valid_b_objects():
        return ClassB.objects.exclude(restrictions__in=self.restrictions)

但这感觉不对。同样,如果ClassB对象中的任何限制也在我的ClassA对象中,那么应该从查询中排除该ClassB实例。所以,如果:

  • object_a包含限制1,2和3
  • object_b1包含限制2,4和5
  • object_b2包含限制1和2
  • object_b3包含限制1,2,3,4和5
  • object_b4包含限制4和5
  • object_b5包含限制5
  • object_b6不含限制

然后object_a.get_valid_b_objects()应返回object_b4,object_b5和object_b6。

非常感谢你。如果已经解决了这个问题,请随时向我提出另一个答案。

1 个答案:

答案 0 :(得分:3)

你有什么应该工作。只需确保使用实际的QuerySet,而不是相关的经理:

# don't forget '.all()'
return ClassB.objects.exclude(restrictions__in=self.restrictions.all())

这将排除任何B个实例限制的A个实例。