Django ManyToManyField 排除

kof*_*dog 5 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)
Run Code Online (Sandbox Code Playgroud)

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

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

    def get_valid_b_objects():
        return ClassB.objects.exclude(restrictions__in=self.restrictions)
Run Code Online (Sandbox Code Playgroud)

但这感觉不对。同样,如果 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。

非常感谢。如果这个问题已经得到解决,请随时引导我找到另一个答案。

sch*_*ggl 5

你所拥有的应该有效。只需确保您使用实际的QuerySet,而不是相关的管理器:

# don't forget '.all()'
return ClassB.objects.exclude(restrictions__in=self.restrictions.all())
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你!我必须为浪费您的时间而道歉,因为反对票表明这是一个非常基本的问题。我确实以制造机器人为生,但网络框架对我来说就像一门外语。 (4认同)
  • 不客气!哈哈,如果有人浪费我的时间,那肯定不是你......:-/ (3认同)