No modelo do Django, QuerySets, vejo que há a __gt
e __lt
para valores comparativos, mas existe um __ne
/ !=
/ <>
( não é igual a ?)
Quero filtrar usando um não é igual a:
Exemplo:
Model:
bool a;
int x;
eu quero
results = Model.objects.exclude(a=true, x!=5)
A !=
sintaxe não está correta. Eu tentei __ne
, <>
.
Acabei usando:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
a=true
primeiro e depois aplica ox=5
filtro ao restante. A consulta pretendida requer apenas aqueles coma=true
ex!=5
. A diferença é que todos aqueles coma=true
ex=5
também são filtrados.Respostas:
Talvez objetos Q possam ser úteis para esse problema. Eu nunca os usei, mas parece que eles podem ser negados e combinados como expressões python normais.
Atualização: Acabei de experimentar, parece funcionar muito bem:
fonte
Sua consulta parece ter um duplo negativo; você deseja excluir todas as linhas em que x não é 5; portanto, em outras palavras, você deseja incluir todas as linhas em que x É 5. Acredito que isso funcionará.
Para responder sua pergunta específica, não existe um "não é igual a", mas provavelmente porque o django tem os métodos "filter" e "exclude" disponíveis para que você sempre possa alternar a lógica para obter o resultado desejado.
fonte
results = Model.objects.filter(a=true).exclude(x=5)
exclude
e asfilter
chamadas não fizeram nenhuma diferença significativa. A ordem das condições naWHERE
cláusula muda, mas como isso importa?a
field=value
sintaxe nas consultas é uma abreviação defield__exact=value
. Isto é, o Django coloca operadores de consulta nos campos de consulta nos identificadores . O Django suporta os seguintes operadores:Tenho certeza de que, combinando-os com os objetos Q, como Dave Vogt sugere e usando
filter()
ouexclude()
como Jason Baker sugere, você obterá exatamente o que precisa para praticamente qualquer consulta possível.fonte
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
e funciona.icontains
,iexact
e similar significa "ignorar maiúsculas e minúsculas". Não é para "inverso".exclude()
vários termos, poderá compor a proposição com oOR
operador, por exemploexclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
, para excluir os resultados nas duas condições.É fácil criar uma pesquisa personalizada com o Django 1.7. Há um
__ne
exemplo de pesquisa na documentação oficial do Django .Você precisa criar a própria pesquisa primeiro:
Então você precisa registrá-lo:
E agora você pode usar a
__ne
pesquisa em suas consultas como esta:fonte
No Django 1.9 / 1.10, existem três opções.
Cadeia
exclude
efilter
Use
Q()
objetos e o~
operadorRegistrar uma função de pesquisa personalizada
O
register_lookup
decorador foi adicionado no Django 1.8 e permite a pesquisa personalizada como de costume:fonte
Enquanto com os modelos, você pode filtrar com
=
,__gt
,__gte
,__lt
,__lte
, você não pode usarne
,!=
ou<>
. No entanto, você pode obter uma melhor filtragem usando o objeto Q.Você pode evitar o encadeamento
QuerySet.filter()
eQuerySet.exlude()
, e usar isto:fonte
Decisão de projeto pendente. Enquanto isso, use
exclude()
O rastreador de problemas do Django possui a notável entrada # 5763 , intitulada "Queryset não possui um operador de filtro" diferente de "" . É notável porque (em abril de 2016) foi "aberto há 9 anos" (na idade da pedra do Django), "fechado há 4 anos" e "alterado pela última vez há 5 meses".
Leia a discussão, é interessante. Basicamente, algumas pessoas argumentam que
__ne
devem ser adicionadas, enquanto outras dizem queexclude()
é mais claro e, portanto__ne
, não devem ser adicionadas.(Eu concordo com o anterior, porque o último argumento é mais ou menos equivalente a dizer Python não deve ter
!=
porque tem==
enot
já ...)fonte
Usando excluir e filtrar
fonte
Você deve usar
filter
eexclude
assimfonte
O último bit de código excluirá todos os objetos em que x! = 5 e a é True. Tente o seguinte:
Lembre-se, o sinal = na linha acima está atribuindo False ao parâmetro ae o número 5 ao parâmetro x. Não está verificando a igualdade. Portanto, não há realmente nenhuma maneira de usar o símbolo! = Em uma chamada de consulta.
fonte
results = Model.objects.filter(a__in=[False,None],x=5)
fonte
Django-model-values (disclosure: author) fornece uma implementação da pesquisa NotEqual , como nesta resposta . Ele também fornece suporte sintático para ele:
fonte
O que você está procurando são todos os objetos que possuem
a=false
oux=5
. No Django,|
serve comoOR
operador entre conjuntos de consultas:fonte
Isso dará o resultado desejado.
para não igualar você pode usar
~
em uma consulta igual. obviamente,Q
pode ser usado para alcançar a consulta igual.fonte
Q(a=True) and ~Q(x=5)
seria avaliado~Q(x=5)
como argumentos para.exclude
. Leia: docs.python.org/3/reference/expressions.html#boolean-operations e docs.python.org/3/reference/… .Cuidado com muitas respostas incorretas para esta pergunta!
A lógica de Gerard está correta, embora retorne uma lista em vez de um conjunto de consultas (o que pode não importar).
Se você precisar de um conjunto de consultas, use Q:
fonte