Filtragem para nomes vazios ou nulos em um queryset

votos
340

Eu tenho first_name, last_name & apelido (opcional) que eu preciso procurar. Então, eu preciso de uma consulta para me dar todos os nomes que têm um conjunto alias.

Só se eu poderia fazer:

Name.objects.filter(alias!=)

Então, o que é o equivalente ao acima?

Publicado 10/05/2009 em 03:26
fonte usuário
Em outras línguas...                            


7 respostas

votos
647

Você poderia fazer isso:

Name.objects.exclude(alias__isnull=True)

Se você precisar excluir valores nulos e cadeias vazias, a forma preferida de fazer isso é para encadear as condições assim:

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

Encadeamento esses métodos juntos basicamente verifica cada condição de forma independente: no exemplo acima, excluímos as linhas onde aliasé ou nulo ou uma cadeia vazia, para que você obtenha todos os Nameobjetos que têm, um não-vazia não-nula aliascampo. O SQL gerado seria algo parecido com:

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

Você também pode passar vários argumentos para uma única chamada para exclude, que seria garantir que apenas os objetos que atendem a todas as condições se excluídos:

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

Aqui, as linhas em que some_field e other_field são verdadeiras se excluídos, então temos todas as linhas em ambos os campos não são verdadeiras. O código SQL gerado iria olhar um pouco como este:

SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)

Alternativamente, se a sua lógica é mais complexa do que isso, você poderia usar do Django objetos Q :

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

Para mais informações consulte esta página e esta página na documentação do Django.

Como um aparte: Meus exemplos de SQL são apenas uma analogia - o código SQL gerado real provavelmente será diferente. Você vai ter uma compreensão mais profunda de como as consultas do Django funciona por realmente olhando para o SQL que geram.

Respondeu 10/05/2009 em 03:41
fonte usuário

votos
33

Em primeiro lugar, os docs Django recomendamos não usar valores nulos para campos de texto, tais como CharField ou TextField. Leia a documentação para a explicação:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

Solução: Você também pode encadear métodos em QuerySets, eu acho. Tente isto:

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

Isso deve dar-lhe o conjunto que você está procurando.

Respondeu 04/06/2009 em 16:15
fonte usuário

votos
28
Name.objects.filter(alias__gt='',alias__isnull=False)
Respondeu 23/02/2011 em 10:14
fonte usuário

votos
2

De Django 1.8,

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Respondeu 06/03/2016 em 12:02
fonte usuário

votos
0

Para evitar erros comuns ao usar exclude, lembre-se:

Você pode não adicionar várias condições em uma exclusão () bloco como filter. Para excluir várias condições, você deve usar múltiplos excluir ()

Exemplo

incorreta :

User.objects.filter (email='example@example.com '). Excluir (profile__nick_name ='', profile__avt = '')

correta :

User.objects.filter (email='example@example.com '). Excluir (profile__nick_name =' '). Excluir (profile__avt =' ')

Respondeu 04/07/2019 em 13:50
fonte usuário

votos
0

esta é outra maneira simples de fazê-lo.

Name.objects.exclude(alias=None)
Respondeu 10/10/2018 em 17:15
fonte usuário

votos
0

Você pode simplesmente fazer isso:

Name.objects.exclude(alias="")

As respostas parecem dançar em torno deste, mas é realmente simples assim. filteré usado para corresponder e excludeé combinar tudo, mas o que ele especifica.

Respondeu 08/05/2018 em 15:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more