Respostas:
Você pode fazer isso:
Name.objects.exclude(alias__isnull=True)
Se você precisar excluir valores nulos e cadeias vazias, a maneira preferida de fazer isso é encadear as condições da seguinte forma:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
O encadeamento desses métodos basicamente verifica cada condição independentemente: no exemplo acima, excluímos linhas onde aliasé nulo ou uma sequência vazia, para que você obtenha todos os Nameobjetos que possuem um campo não nulo e não vazio alias. O SQL gerado seria algo como:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Você também pode passar vários argumentos para uma única chamada exclude, o que garantiria que apenas os objetos que atendam a todas as condições sejam excluídos:
Name.objects.exclude(some_field=True, other_field=True)
Aqui, as linhas em que some_field e other_field true são excluídas, então obtemos todas as linhas em que ambos os campos não são verdadeiros. O código SQL gerado ficaria assim:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Como alternativa, se sua lógica é mais complexa que isso, você pode usar os objetos Q do Django :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Para mais informações, veja esta página e esta página nos documentos do Django.
Como um aparte: Meus exemplos de SQL são apenas uma analogia - o código SQL real gerado provavelmente parecerá diferente. Você terá uma compreensão mais profunda de como as consultas do Django funcionam, na verdade, olhando para o SQL que elas geram.
ORpara fundir as condições. Vou editar minha resposta para esclarecer.
NOT (A AND B)é equivalente a NOT A OR NOT B. Eu acho que isso torna as coisas confusas para os novos desenvolvedores do Django que conhecem SQL, mas não estão familiarizados com ORMs.
ANDa primeira consulta em uma ORporque você está usando exclude. No caso geral, provavelmente é mais correto pensar em encadeamento como um THEN, ie exclude(A) THEN exclude(B). Desculpe pela linguagem severa acima. Sua resposta é realmente boa, mas estou preocupado com os novos desenvolvedores levarem sua resposta muito geralmente.
ANDe ORpode ser útil para alguém que vem ao Django com experiência em SQL. Para uma compreensão mais profunda do Django, acho que os documentos fazem um trabalho melhor do que eu.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=Falsecondição é redundante. Se o campo for Nullcertamente, será excluído pela primeira cláusula?
alias__gtfoi a única coisa que funcionou para colunas do tipo JSON em que eu queria excluir cadeias de caracteres vazias do JSON {'something:''}. Portanto, a sintaxe do trabalho é:jsoncolumnname__something__gt=''
Primeiramente, os documentos do Django recomendam enfaticamente não usar valores NULL para campos baseados em string, 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 no QuerySets, eu acho. Tente o seguinte:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Isso deve lhe dar o conjunto que você está procurando.
Do Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Para evitar erros comuns ao usar exclude, lembre-se:
Você pode não adicionar várias condições em um bloco exclude () como filter. Para excluir várias condições, você deve usar várias exclusões ()
Exemplo
Incorreto :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' ', profile__avt =' ')
Correto :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' '). Exclude (profile__avt =' ')
Você pode simplesmente fazer isso:
Name.objects.exclude(alias="").exclude(alias=None)
É realmente simples assim. filteré usado para corresponder e excludecorresponde a tudo, exceto o que ele especifica. Isso avaliaria em SQL como NOT alias='' AND alias IS NOT NULL.
alias="") e NULL ( alias=None) da consulta. O seu incluiria instâncias com Name(alias=None).
.filter(alias!="")mas não o título. Eu editei minha resposta. No entanto, os campos de caracteres não devem permitir valores NULL e usar a sequência vazia para um valor não (conforme a convenção).
essa é outra maneira simples de fazer isso.
Name.objects.exclude(alias=None)
Nonenão é a mesma coisa que "".
OR(somente neste caso), ele produz um SQLAND. Consulte esta página para referência: docs.djangoproject.com/en/dev/topics/db/queries/… A vantagem do encadeamento é que você pode misturarexcludeefiltermodelar condições de consulta complicadas. Se você deseja modelar um SQL real,ORvocê deve usar um objeto Django Q: docs.djangoproject.com/en/dev/topics/db/queries/… Edite sua edição para refletir isso, pois a resposta é muito enganosa do jeito que está .