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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top