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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top