2010-01-22 6 views
1

Je ces modèles:django: filtre plus compliqué

classe A (modèle): passe

classe B (modèle): a = ForeignKey (A)

classe C (Modèle): b = ForeignKey (B)

J'ai une instance de A appelée mya.

Je veux trouver tous les B est pour mon A, pour lequel il existe au moins un C. Je peux le faire en une ligne:

bsiwant = [cb C dans C.objects.filter (b__a = = mya)] (et uniquify en quelque sorte)

... mais probablement que cela causerait de nombreuses requêtes. Y at-il un moyen de le faire avec le filtre de telle sorte qu'une seule requête serait effectuée?

Répondre

1

En fait, cela devrait le faire:

B.objects.filter(a=mya, c__b__isnull=False) 

ou

B.objects.filter(a=mya, c__b=F('id')) 
1
vals = C.objects.filter(b__a=mya).select_related("b").distinct() 
bsiwant = [c.b for c in vals] 

devrait le faire en une seule requête.