template - Negación de consulta Django
length django template (3)
Aquí está la referencia de la API QuerySet . exclude
parece hacer lo que quieras.
Sé cómo crear filtros y objetos Q en django, pero no sé cómo negar los operadores que proporciona la API, por ejemplo, para el operador de contenidos, me gustaría algo como no contiene.
p.ej
q=Q(name__notcontains="SomeString")
Esto me conseguiría todos los objetos cuyo nombre no contenga "SomeString".
¿Hay alguna sintaxis que me falta?
Gracias.
Puedes usar exclude()
en lugar de filter()
:
Entry.objects.exclude(name__contains="SomeString")
("dame todas las entradas EXCEPTO aquellas con names
contengan" SomeString ")
Y cuando se trata de un objeto Q, puede usar el símbolo "~" antes del objeto Q para representar la negación. Por ejemplo, la siguiente declaración significa "dame todas las entradas con names
contengan" Elephant ", pero NO que contengan" 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 aquellas con names
contengan" Elefante ", pero que NO contengan" SomeString ")
Utilice exclude
como Hank sugiere o, para el caso particular, use Q (name__regex = r ''! (SomeString)'') si realmente necesita usar el filter
. Tenga en cuenta que la regex
no es regex
base de datos, verifique qué sintaxis admite primero su db.