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 Name
objetos 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.
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 misturarexclude
efilter
modelar condições de consulta complicadas. Se você deseja modelar um SQL real,OR
você 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á .OR
para fundir as condições. Vou editar minha resposta para esclarecer.NOT (A AND B)
é equivalente aNOT 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.AND
a primeira consulta em umaOR
porque você está usandoexclude
. No caso geral, provavelmente é mais correto pensar em encadeamento como umTHEN
, ieexclude(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.AND
eOR
pode 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.fonte
alias__isnull=False
condição é redundante. Se o campo forNull
certamente, será excluído pela primeira cláusula?alias__gt
foi 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:
Isso deve lhe dar o conjunto que você está procurando.
fonte
Do Django 1.8,
fonte
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
fonte
Você pode simplesmente fazer isso:
É realmente simples assim.
filter
é usado para corresponder eexclude
corresponde a tudo, exceto o que ele especifica. Isso avaliaria em SQL comoNOT alias='' AND alias IS NOT NULL
.fonte
alias=""
) e NULL (alias=None
) da consulta. O seu incluiria instâncias comName(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.
fonte
None
não é a mesma coisa que""
.