2016-10-10 83 views
-2

多对多的过滤关系的一端,倒数后我有两个模型是一个多对多的关系,我想会发生以下效果:Django的 - 总是产生价值1

  • 考虑模型AB在与eachother多对多的关系。
  • A的related_name为BbsB的为A相关的名字是as
  • 每当我创建一个AB它都会被立即连接到一个或多个其他的,所以最初所有实例AB将至少有一个相关的对象。
  • 如果我想删除A(姑且称之为a0)我希望它删除所有B s表示会留下没有相关Aa0被删除后,所以基本上我想删除只有所有Ba0在其相关的集合as(这也是相反的例子)。

我是想实现这个是这样的,当我想删除Aa0,我会说:

a0.bs.annotate(Count('bs')).filter(bs__count=1).delete() 

但是这将无条件地a0.bs删除所有相关B的情况下,当我去了壳来测试它,我会得到这样的结果:

>>> a0.bs.annotate(Count('bs')).values_list('bs__count',flat=True) 
<QuerySet [1, 1, 1, 1]> 
>>> B.objects.filter(as=a0).annotate(Count('bs')).values_list('bs__count',flat=True) 
<QuerySet [1, 1, 1, 1]> 

但我也将获得这一点,如果我这样做有在同一个数据库实例:

>>> B.objects.annotate(Count('bs')).filter(as=a0).values_list('bs__count',flat=True) 
<QuerySet [1, 4, 6, 6]> 

所以这是3出这些B实例4 owuldn't满足count == 1但如果我筛选特定B情况下,我想看看他们之前都满足的情况下注释,这似乎比使用的最后一个命令(具有准确结果的那个命令更有效)更有效。

任何人都可以给我这种效果的任何见解吗?

+0

这不是使用A,B,a0和b0的数学问题,请使用适当的变量名称 – e4c5

回答

0

难道你不能假定任何没有任何相关A记录的B记录也应该删除吗?反之亦然。

A.objects.filter(pk=1).delete() 
B.objects.filter(as=None).delete()