Filtrado de nombres vacíos o NULL en un conjunto de consulta

Tengo first_name, last_name y alias (opcional) que necesito buscar. Entonces, necesito una consulta para darme todos los nombres que tienen un conjunto de alias.

Solo si pudiera:

Name.objects.filter(alias!="") 

Entonces, ¿cuál es el equivalente a lo de arriba?

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 esta manera:

 Name.objects.exclude(alias__isnull=True).exclude(alias__exact='') 

Al unir estos métodos, básicamente, se comprueba cada condición de forma independiente: en el ejemplo anterior, excluimos las filas donde el alias es nulo o una cadena vacía, por lo que obtenemos todos los objetos Name que tienen un campo alias no nulo, no vacío. El SQL generado sería algo así como:

 SELECT * FROM Name WHERE alias IS NOT NULL AND alias != "" 

También puede pasar múltiples argumentos a una única llamada para exclude , lo que garantizaría que solo se exclude objetos que cumplan con cada condición:

 Name.objects.exclude(some_field=True, other_field=True) 

Aquí, las filas en las que some_field y other_field son verdaderos quedan excluidos, 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.

Como comentario: mis ejemplos de SQL son solo una analogía: el código SQL generado probablemente sea diferente. Obtendrá una comprensión más profunda de cómo funcionan las consultas de Django si realmente observa el SQL que generan.

En primer lugar, los documentos de Django recomiendan encarecidamente no utilizar 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 puede encadenar métodos en QuerySets. Prueba esto:

 Name.objects.exclude(alias__isnull=True).exclude(alias="") 

Eso debería darte el conjunto que estás buscando.

 Name.objects.filter(alias__gt='',alias__isnull=False) 

De Django 1.8,

 from django.db.models.functions import Length Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0) 

Simplemente puede hacer esto:

 Name.objects.exclude(alias="") 

Las respuestas parecen estar danzando alrededor de esto, pero es así de simple. filter se usa para hacer coincidir y exclude para hacer coincidir todo excepto lo que especifica.