Pregunta
Yo sé cómo construir filtros y objetos Q en Django, pero no sé cómo negar los operadores que la API proporciona, por ejemplo, para el operador contains me gustaría algo así como notcontains.
por ejemplo.
q=Q(name__notcontains="SomeString")
Esto me llevaría todos los objetos cuyo nombre no contienen "someString".
¿Hay alguna sintaxis que me falta?
Gracias.
Solución
Se puede usar 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 objeto Q para representar la negación. Por ejemplo, los siguientes medios afirmación "me dan todas las entradas con names
que contiene 'elefante', pero que no contiene '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")
Otros consejos
Aquí está la QuerySet API referencia . exclude
parece hacer lo que quiera.
De cualquier uso exclude
como Hank sugiere o, para el caso particular contains
, el uso Q (name__regex = r '! (SomeString)') si realmente necesita usar el filter
. Se advierte sin embargo que no es regex
base de datos agnóstica, comprobar lo Sintaxis de sus soportes db primero.