2009-05-26 13 views

Respuesta

28

Sobre la base de su respuesta a Ned, se Parece que solo quiere excluir una lista de etiquetas. Por lo que sólo podría utilizar el filtro in:

names_to_exclude = [o.name for o in objects_to_exclude] 
Foo.objects.exclude(name__in=names_to_exclude) 

hace eso lo que quiere?

+0

Lo hago con una lista de objects_to_exclude directamente, no utilizo el o.name: ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude (tags__in = ignore_tags)) – Johnd

3

¿Qué pasa con la exclusión de llamadas múltiples veces? Las consultas son flojas, no pasa nada hasta que intenta extraer datos de ella, por lo que no hay inconveniente en usar .exclude() más de una vez.

+0

Tengo un modelo que tiene una etiqueta de campo manytomany. el usuario puede tener una gran cantidad de etiquetas de ignorar. Quiero excluir dinámicamente los objetos que el usuario no quiere ver. No sabré cuántas veces llamar a exclude hasta el tiempo de ejecución. – Johnd

+0

¿Puedes explicar lo que quieres decir con "las consultas son flojas" y "extraer datos de ellas"? Thnx – akki

+1

Lo que significa perezoso es que no se extraerán datos de la base de datos hasta que realmente se use la consulta. –

4

Puede hacerlo con bastante facilidad con la Q object:

from django.db.models import Q 

excludes = None 
for tag in ignored_tags: 
    q = Q(tag=tag) 
    excludes = (excludes and (excludes | q)) or q # makes sure excludes is set properly 
set_minus_excluded = Foo.objects.exclude(excludes) 

También debe ser capaz de hacerlo de forma dinámica con excluir():

qs = Foo.objects.all() 
for tag in ignored_tags: 
    qs = qs.exclude(tag=tag) 
0

Para mejorar la respuesta de Daniel Roseman Creo que sería mejor para obtener los valores que necesita directamente desde el conjunto de consultas en lugar del bucle for que podrían ser caros en grandes conjuntos de datos, es decir,

names_to_exclude = objects_to_exclude.values_list('name') 
Foo.objects.exclude(name__in=names_to_exclude) 
-1

Usted puede tratar esto también.

exclude_list = ['A', 'B', 'C'] qs = Foo.objects.exclude(items__in=exclude_list)