Skip to main content
 首页 » 编程设计

python之Django ManyToManyField 排除

2024年08月20日37dflying

我是 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。

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

请您参考如下方法:

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

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

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