Domanda
So come creare filtri e Q oggetti in django, ma non so come negare gli operatori che l'API fornisce, per esempio per l'operatore di contenuto vorrei qualcosa di simile notcontains.
ad es.
q=Q(name__notcontains="SomeString")
Questo mi avrebbe tutti gli oggetti il cui nome non contengono "SomeString".
C'è qualche sintassi che mi sto perdendo?
Grazie.
Soluzione
È possibile utilizzare exclude()
in luogo di filter()
:
Entry.objects.exclude(name__contains="SomeString")
("dammi tutte le voci ad ECCEZIONE di quelli con names
contenenti "SomeString")
E quando ha a che fare con Q oggetto puoi usare il simbolo "~" prima di Q oggetto per rappresentare la negazione.Per esempio, la seguente istruzione significa "dammi tutte le Voci con names
contenenti "Elefante", ma NON contenente "SomeString":
Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
In alcuni casi è possibile che si desidera utilizzare entrambi i metodi:
Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
("dammi tutte le voci, ad ECCEZIONE di quelli con names
contenenti "Elefante", ma NON contenente "SomeString")
Altri suggerimenti
Ecco il QuerySet API di riferimento. exclude
sembra fare ciò che si desidera.
Utilizzare exclude
Hank suggerisce o per il particolare contains
caso, utilizzare Q(nome__regex=r'!(SomeString)') se avete veramente bisogno di usare il filter
.Essere avvertito, però, che regex
non è database indipendente, verificare che la sintassi del tuo db supporta primo.