Respuestas:
Podrías hacer esto:
Name.objects.exclude(alias__isnull=True)
Si necesita excluir valores nulos y cadenas vacías, la forma preferida de hacerlo es encadenar las condiciones de la siguiente manera:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
El encadenar estos métodos básicamente verifica cada condición de forma independiente: en el ejemplo anterior, excluimos las filas donde alias
es nulo o una cadena vacía, por lo que obtiene todos los Name
objetos que tienen un campo no nulo, no vacío alias
. El SQL generado se vería así:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
También puede pasar múltiples argumentos a una sola llamada a exclude
, lo que garantizaría que solo los objetos que cumplan con todas las condiciones sean excluidos:
Name.objects.exclude(some_field=True, other_field=True)
Aquí, las filas en las que some_field
y other_field
son verdaderas se excluyen, por lo que obtenemos todas las filas donde ambos campos no son verdaderos. El código SQL generado se vería un poco así:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Alternativamente, si su lógica es más compleja que eso, podría usar los objetos Q de Django :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Para obtener más información, consulte esta página y esta página en los documentos de Django.
Por otro lado: Mis ejemplos de SQL son solo una analogía: el código SQL generado probablemente se verá diferente. Obtendrá una comprensión más profunda de cómo funcionan las consultas de Django al observar realmente el SQL que generan.
OR
para fusionar las condiciones. Editaré mi respuesta para aclarar.
NOT (A AND B)
es equivalente a NOT A OR NOT B
. Creo que eso confunde las cosas a los nuevos desarrolladores de Django que conocen SQL pero no están familiarizados con los ORM.
AND
la primera consulta en una OR
porque está utilizando exclude
. En el caso general, probablemente sea más correcto pensar en encadenar como a THEN
, es decir exclude(A) THEN exclude(B)
. Perdón por el lenguaje duro anterior. Su respuesta es realmente buena, pero me preocupa que los nuevos desarrolladores también tomen su respuesta en general.
AND
y OR
podría ser útil para alguien que viene a Django desde un fondo SQL. Para una comprensión más profunda de Django, creo que los documentos hacen un mejor trabajo que yo.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
condición es redundante. Si el campo es Null
seguro, ¿será excluido por la primera cláusula?
alias__gt
fue lo único que funcionó para las columnas de tipo JSON donde quería excluir cadenas vacías de JSON como {'something:''}
. Entonces la sintaxis de trabajo es:jsoncolumnname__something__gt=''
En primer lugar, los documentos de Django recomiendan no usar valores NULL para campos basados en cadenas como CharField o TextField. Lea la documentación para la explicación:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Solución: creo que también puedes encadenar métodos en QuerySets. Prueba esto:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Eso debería darte el set que estás buscando.
Desde Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Para evitar errores comunes al usar exclude
, recuerde:
Puede no añadir varias condiciones en una excluir () bloque como filter
. Para excluir múltiples condiciones, debe usar la exclusión múltiple ()
Ejemplo
Incorrecto :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' ', profile__avt =' ')
Correcto :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' '). Exclude (profile__avt =' ')
Simplemente puedes hacer esto:
Name.objects.exclude(alias="").exclude(alias=None)
Realmente es así de simple. filter
se usa para hacer coincidir y exclude
para hacer coincidir todo menos lo que especifica. Esto se evaluaría en SQL como NOT alias='' AND alias IS NOT NULL
.
alias=""
) y NULL ( alias=None
) de la consulta. El tuyo incluiría instancias con Name(alias=None)
.
.filter(alias!="")
pero no al título. He editado mi respuesta. Sin embargo, los campos de caracteres no deben permitir valores NULL y usar la cadena vacía para un valor no (según la convención).
Esta es otra forma simple de hacerlo.
Name.objects.exclude(alias=None)
None
No es lo mismo que ""
.
OR
(solo en este caso), produce un SQLAND
. Consulte esta página como referencia: docs.djangoproject.com/en/dev/topics/db/queries/… La ventaja del encadenamiento es que puede mezclarexclude
yfilter
modelar condiciones de consulta complicadas. Si desea modelar un SQL realOR
, debe usar un objeto Django Q: docs.djangoproject.com/en/dev/topics/db/queries/… Edite su edición para reflejar esto, ya que la respuesta es muy engañosa tal como está. .