2012-09-26 4 views

Répondre

18
foo_queryset = Foo.objects.filter(attr=value) 
referenced_bars = Bar.objects.filter(id__in=foo_queryset.values('bar_id')) 
+1

Voici un lien vers la [ 'in'] (https://docs.djangoproject.com/en/dev/ref/models/querysets/# in) recherche dans les docs. –

+0

Je suis curieux, à quel point est-ce efficace et est-il possible de le faire plus efficacement? – Algorithmatic

+0

@Algorithmatic - c'est une question très large, cela dépend de la base de données que vous utilisez, des données et des index sur ces données. Exécuter ceci sur MySQL peut être terriblement lent car MySQL est terrible à gérer les sous-requêtes que génère Django. Pour contourner ce problème, vous pouvez effectuer une requête pour obtenir le 'bar_ids' et ensuite passer à la clause' __in' 'Bar.objects.filter (id__in = set (foo_queryset.values ​​('bar_id')))' évidemment si vous avez beaucoup d'objets 'Foo' cela peut aussi être lent –

0
bars = Bar.objects.filter(foo_set__attr=value) 
+0

Où va mon' QuerySet' contenant les 'Foo's concernés? – Kimvais

+0

Je pensais - et cette pensée aurait pu être fausse - ce serait le plus facile d'ignorer le sous-jeu (un objet moins à prendre en compte). Appliquez plutôt les limites/filtres de ce qeryset initial directement aux barres. Fondamentalement, foo_set__attr = value est juste un espace réservé que vous pouvez étendre à ce que vous voulez pour définir les Foo que vous souhaitez utiliser. Est-ce que cela vous aiderait ou insisteriez-vous sur l'utilisation d'un ensemble de requêtes Foo distinct? – schacki

Questions connexes