2009-10-29 3 views
3

Je dois travailler avec un jeu de requête, qui est déjà filtré, par exemple. qs = queryset.filter (language = 'de') mais dans une opération ultérieure, je dois annuler une partie du filtrage déjà appliqué, par exemple ne pas prendre uniquement les lignes avec language = 'de' mais les entrées dans toutes les langues. Existe-t-il un moyen d'appliquer de nouveau le filtre et de faire en sorte que les nouveaux paramètres soient connectés à ceux qui existent déjà en utilisant OU ne pas ajouter, par exemple. si le queryset est déjà filtré pour language = 'de' et que je serais capable de connecter un 'OR language =' en 'à ça, ça me donnerait ce que je cherche! Merci!Django: Extension de Querysets/Connexion de plusieurs filtres avec OU

Répondre

2

Je ne crois pas qu'il soit possible de faire ce que vous demandez.

La façon dont vous faites ORs dans django est comme ceci:

Model.objects.filter(Q(question__startswith='Who') | Q(question__startswith='What')) 

donc si vous vouliez vraiment faire ceci:

Model.objects.filter(Q(language='de') | Q(language='en')) 

vous devez les mettre à la fois dans le même filtre () appelez donc vous ne pourrez pas ajouter l'autre ou clause dans un appel de filtre() plus tard.

Je pense que la raison pour laquelle vous essayez peut-être de faire cela est que vous vous inquiétez de cliquer à nouveau sur la base de données, mais la seule façon d'obtenir des résultats précis serait de réapparaître dans la base de données.

Si vous êtes simplement préoccupé par la production propre, le code DRY, vous pouvez mettre tous les filtres qui sont communs aux deux requêtes en haut, puis « fourchette » qui requête réglée plus tard, comme ceci:

shared_qs = Model.objects.filter(active=True) 
german_entries = shared_qs.filter(language='de') 
german_and_english = shared_qs.filter(Q(language='de') | Q(language='en')) 
+0

Eh bien c'est ce que je pensais aussi, que je peux faire "Ou" des requêtes dans un filtre en utilisant Q! Je voulais juste savoir s'il y avait une autre possibilité! Merci! –

+1

Il ne semble pas que vous le soyez, mais si vous utilisez des relations m2m, allez lire les docs sur ceux-ci attentivement, ils sont difficiles: http://docs.djangoproject.com/en/dev/topics/db/ requêtes/# spanning-multi-valu-relations –

Questions connexes