than queryset not none greater equal empty blank and django django-models django-queryset filter null

not - django queryset>=



Filtrado de nombres vacíos o NULL en un queryset (6)

Desde Django 1.8,

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

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

Solo si pudiera hacer:

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

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


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

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

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


Esta es otra forma simple de hacerlo.

Name.objects.exclude(alias=None)


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='''')

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

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

También puede pasar varios argumentos a una sola 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 verdaderas se excluyen, por lo que obtenemos todas las filas donde ambos campos no son verdaderas. 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 la documentación de Django.

Como nota aparte: mis ejemplos de SQL son solo una analogía: el código SQL generado real 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.


Simplemente puede hacer esto:

Name.objects.exclude(alias="")

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


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