2016-10-10 45 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()