Negação de consulta do django
Pergunta
Eu sei como criar filtros e objetos Q em Django, mas não sei como negar os operadores que a API fornece, por exemplo, para o operador contém que eu gostaria de algo como NotContains.
por exemplo
q=Q(name__notcontains="SomeString")
Isso me levaria a todos os objetos cujo nome não contém "Somestring".
Existe alguma sintaxe que estou perdendo?
Obrigada.
Solução
Você pode usar exclude()
no lugar de filter()
:
Entry.objects.exclude(name__contains="SomeString")
("Dê -me todas as entradas, exceto aquelas com names
contendo "Somestring")
E ao lidar com o objeto Q, você pode usar o símbolo "~" antes do objeto Q para representar a negação. Por exemplo, a seguinte declaração significa "me dê todas as entradas com names
contendo "elefante", mas não contendo "Somestring":
Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
Em alguns casos, você pode querer usar os dois métodos:
Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
("Me dê todas as entradas, exceto aquelas com names
contendo "elefante", mas não contendo "Somestring")
Outras dicas
Aqui está o Referência da API de consulta. exclude
parece fazer o que você quer.
Use exclude
Como Hank sugere ou, para o particular contains
caso, use q (name__regex = r '! (Somestring)') se você realmente precisar usar o filter
. Esteja avisado que regex
não é o banco de dados-agnóstico, verifique o que a sintaxe do seu banco de dados suporta primeiro.