2012-03-22 49 views
0

我有鋪設出像這樣(有很多場)某些型號:Django模型 - 搜索與「落後」 ForeignKeys and'd Q的

class A(models.Model): 
    name = models. 
class B(models.Model): 
    foo = models.ForeignKey(A) 

和我有一個使用Q一個搜索系統對象; 01是主鍵,由ModelMultipleChoiceField以一種形式獲得,並且它們的foo都指向相同的A

所以對或邏輯,我可以用這個

>>> A.objects.filter(Q(b__pk=0) | Q(b__pk=1)) 
[<A: A object>, <A: A object>] 

,我可以用

A.objects.filter(Q(b__pk=0) | Q(b__pk=1)).distinct() 

不過,我也想這樣做and邏輯解決重複。理想情況下,它可以使用&而不是|,但這不起作用。

>>> A.objects.filter(Q(b__pk=0) & Q(b__pk=1)) 
[] 

那麼,最簡​​單的方法是什麼?

回答

1

猜要甲實例具有至少一個B()W /主鍵1和一個B()W /主鍵0

然後,你需要

(A.objects.filter(b__pk=0) & A.objects.filter(b__pk=1)).distinct() 

或者如果滿足下列加入傷害

A.objects.filter(
    models.Q(pk__in=B.objects.filter(pk=0).values('foo_id')) & 
    models.Q(pk__in=B.objects.filter(pk=1).values('foo_id'))) 

如果需要A(),其僅具有兩個相對的B()一種W/PK = 0和另一個PK = 1,限制應由

應用於上述查詢集
queryset.annotate(b_count=models.Count('b')).filter(b_count=2) 
+0

我不知道queryset的'__and__'做了連接。不錯。我會看看你的解決方案,如果以後工作... – forivall 2012-03-22 07:29:06

+0

是的,完美的作品。我使用了第二個,因爲我更喜歡使用Q對象,因爲我做了'query = reduce(Q .__ and__,queries)' – forivall 2012-03-23 00:17:08

0

,我想出了在調查我的問題最好的解決辦法是這樣的:

match_keys = [0,1] 
matches = [s for s in A.objects.all() if len(s.b_set.filter(pk__in=match_keys)) == len(match_keys)] 

不過,我想知道是否有更好的方法來做到這一點,只是使用Q對象,從而在ORM中完成所有工作。