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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top