En el modelo de Django QuerySets, veo que hay un __gt
y __lt
para valores comparativos, pero ¿hay un __ne
/ !=
/ <>
( no es igual ?)
Quiero filtrar usando un no igual:
Ejemplo:
Model:
bool a;
int x;
quiero
results = Model.objects.exclude(a=true, x!=5)
La !=
sintaxis no es correcta. Probé __ne
, <>
.
Terminé usando:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
a=true
primero y luego aplica elx=5
filtro al resto. La consulta prevista solo requería aquellos cona=true
yx!=5
. La diferencia es que todos aquellos cona=true
yx=5
también se filtran.Respuestas:
Quizás los objetos Q podrían ser de ayuda para este problema. Nunca los he usado, pero parece que se pueden negar y combinar de manera muy similar a las expresiones normales de Python.
Actualización: acabo de probarlo, parece funcionar bastante bien:
fuente
Su consulta parece tener un doble negativo, desea excluir todas las filas donde x no es 5, por lo tanto, en otras palabras, desea incluir todas las filas donde x ES 5. Creo que esto hará el truco.
Para responder a su pregunta específica, no existe un "no igual a", pero probablemente sea porque django tiene disponibles los métodos de "filtro" y "exclusión", por lo que siempre puede cambiar la ronda lógica para obtener el resultado deseado.
fuente
results = Model.objects.filter(a=true).exclude(x=5)
exclude
y lasfilter
llamadas no hicieron ninguna diferencia significativa. El orden de las condiciones en laWHERE
cláusula cambia, pero ¿cómo importa eso?La
field=value
sintaxis en las consultas es una abreviatura defield__exact=value
. Es decir que Django coloca operadores de consulta en campos de consulta en los identificadores . Django es compatible con los siguientes operadores:Estoy seguro de que al combinarlos con los objetos Q como sugiere Dave Vogt y al usar
filter()
oexclude()
como Jason Baker sugiere , obtendrá exactamente lo que necesita para cualquier consulta posible.fuente
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
y funciona.icontains
,iexact
y similar significa "ignorar mayúsculas y minúsculas". No es para "inversa".exclude()
varios términos, es posible que desee redactar la propuesta con elOR
operador, por ejemploexclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
, para excluir los resultados en ambas condiciones.Es fácil crear una búsqueda personalizada con Django 1.7. Hay un
__ne
ejemplo de búsqueda en la documentación oficial de Django .Primero debe crear la búsqueda en sí:
Entonces necesitas registrarlo:
Y ahora puede usar la
__ne
búsqueda en sus consultas de esta manera:fuente
En Django 1.9 / 1.10 hay tres opciones.
Cadena
exclude
yfilter
Usa
Q()
objetos y el~
operadorRegistrar una función de búsqueda personalizada
El
register_lookup
decorador se agregó en Django 1.8 y permite la búsqueda personalizada como de costumbre:fuente
Mientras que con los modelos, puede filtrar con
=
,__gt
,__gte
,__lt
,__lte
, no se puede utilizarne
,!=
o<>
. Sin embargo, puede lograr un mejor filtrado al usar el objeto Q.Usted puede evitar el encadenamiento
QuerySet.filter()
yQuerySet.exlude()
, y usar esto:fuente
Pendiente decisión de diseño. Mientras tanto, use
exclude()
El rastreador de problemas de Django tiene la notable entrada # 5763 , titulada "Queryset no tiene un operador de filtro" no igual " . Es notable porque (a partir de abril de 2016) se "abrió hace 9 años" (en la edad de piedra de Django), "se cerró hace 4 años" y "se modificó por última vez hace 5 meses".
Lea la discusión, es interesante. Básicamente, algunas personas discuten
__ne
que se debe agregar mientras que otras dicen queexclude()
es más claro y, por__ne
lo tanto , no se debe agregar.(Estoy de acuerdo con el anterior, ya que este último argumento es más o menos equivalente a decir Python no debe tener
!=
, ya que tiene==
ynot
que ya ...)fuente
Usando excluir y filtrar
fuente
Deberías usar
filter
yexclude
asífuente
El último bit de código excluirá todos los objetos donde x! = 5 y a es True. Prueba esto:
Recuerde, el signo = en la línea anterior está asignando False al parámetro a y el número 5 al parámetro x. No es verificar la igualdad. Por lo tanto, no hay realmente ninguna forma de usar el símbolo! = En una llamada de consulta.
fuente
results = Model.objects.filter(a__in=[False,None],x=5)
fuente
Django-model-values (revelación: autor) proporciona una implementación de la búsqueda NotEqual , como en esta respuesta . También proporciona soporte sintáctico para ello:
fuente
Lo que está buscando son todos los objetos que tienen
a=false
ox=5
. En Django,|
sirve comoOR
operador entre conjuntos de consultas:fuente
Esto le dará el resultado deseado.
para no igual puede usar
~
en una consulta igual. obviamente,Q
puede usarse para llegar a la consulta igual.fuente
Q(a=True) and ~Q(x=5)
evaluaría~Q(x=5)
como argumentos para.exclude
. Lea: docs.python.org/3/reference/expressions.html#boolean-operations y docs.python.org/3/reference/… .¡Cuidado con muchas respuestas incorrectas a esta pregunta!
La lógica de Gerard es correcta, aunque devolverá una lista en lugar de un conjunto de consultas (lo que podría no importar).
Si necesita un conjunto de consultas, use Q:
fuente