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 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
para 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.
AND
a primeira consulta em uma OR
porque 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.
AND
e OR
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.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
condição é redundante. Se o campo for Null
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:
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 exclude
corresponde 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)
None
nã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 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á .