2010-02-03 18 views
21

Sé cómo construir filtros y objetos Q en django, pero no sé cómo negar los operadores que proporciona la API, por ejemplo, para el operador contains me gustaría algo como no contiene.Django query negation

p. Ej.

q=Q(name__notcontains="SomeString") 

Esto me daría todos los objetos cuyo nombre no contenga "SomeString".

¿Hay alguna sintaxis que me falta?

Gracias.

Respuesta

49

Puede utilizar exclude() en lugar de filter():

Entry.objects.exclude(name__contains="SomeString") 

("Dame todas las entradas excepto aquellos con names que contiene "someString")

Y cuando se trata de objetos Q puede utilizar" ~ "símbolo antes del objeto Q para representar la negación. Por ejemplo, la siguiente declaración significa" darme todas las entradas con names que contenga "Elefante", pero que no contenga "SomeString":

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

En algunos casos es posible que desee utilizar ambos métodos:

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

("dame todas las entradas, excepto aquellos con names que contiene 'elefante', pero que no contiene 'someString')

3

Aquí está el QuerySet API reference. exclude parece hacer lo que quiere.

+0

¡Genial! eso es exactamente lo que necesitaba, aunque no se puede usar dentro de un objeto Q, uno simplemente puede encadenar los filtros juntos: q = Q (title__contains = "SomeTerm") TheModel.objects.filter (q) .exclude (title__contains = "SomeTermWeDontWant") Gracias! –

1

De cualquier use exclude como sugiere Hank o, para el caso particular contains, use Q (name__regex = r '! (SomeString)') si realmente necesita usar el filter. Sin embargo, ten en cuenta que regex no es un agnóstico de base de datos, comprueba qué sintaxis es compatible primero con tu base de datos.