Risposte:
Potresti farlo:
Name.objects.exclude(alias__isnull=True)
Se è necessario escludere valori nulli e stringhe vuote, il modo preferito per farlo è di concatenare le condizioni in questo modo:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Il concatenamento di questi metodi fondamentalmente controlla ogni condizione in modo indipendente: nell'esempio sopra, escludiamo le righe dove alias
è nullo o una stringa vuota, in modo da ottenere tutti gli Name
oggetti che hanno un campo non nullo, non vuoto alias
. L'SQL generato sarebbe simile a:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Puoi anche passare più argomenti a una singola chiamata exclude
, in modo da escludere solo gli oggetti che soddisfano tutte le condizioni:
Name.objects.exclude(some_field=True, other_field=True)
Qui, le righe in cui some_field
e other_field
true sono escluse, quindi otteniamo tutte le righe in cui entrambi i campi non sono true. Il codice SQL generato sarebbe simile al seguente:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
In alternativa, se la tua logica è più complessa di quella, potresti usare gli oggetti Q di Django :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Per maggiori informazioni consulta questa pagina e questa pagina nei documenti Django.
A parte questo: i miei esempi SQL sono solo un'analogia: il codice SQL generato reale probabilmente avrà un aspetto diverso. Otterrai una comprensione più approfondita del funzionamento delle query Django osservando effettivamente l'SQL che generano.
OR
per fondere le condizioni. Modificherò la mia risposta per chiarire.
NOT (A AND B)
è equivalente a NOT A OR NOT B
. Penso che ciò crei confusione per i nuovi sviluppatori Django che conoscono SQL ma non hanno familiarità con gli ORM.
AND
della prima query in una OR
perché stai usando exclude
. Nel caso generale, è probabilmente più corretto pensare di concatenare un THEN
, cioè exclude(A) THEN exclude(B)
. Mi dispiace per il linguaggio aspro sopra. La tua risposta è davvero buona, ma sono preoccupato per i nuovi sviluppatori che prendono la tua risposta troppo in generale.
AND
e OR
potrebbe essere utile per qualcuno che viene a Django da uno sfondo SQL. Per una comprensione più approfondita di Django, penso che i documenti facciano un lavoro migliore di quello che posso.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
condizione sia ridondante. Se il campo è Null
sicuramente verrà escluso dalla prima clausola?
alias__gt
è stata l'unica cosa che ha funzionato per le colonne di tipo JSON in cui volevo escludere stringhe vuote da JSON come {'something:''}
. Quindi la sintassi di lavoro è:jsoncolumnname__something__gt=''
In primo luogo, i documenti Django consigliano vivamente di non utilizzare i valori NULL per i campi basati su stringhe come CharField o TextField. Leggi la documentazione per la spiegazione:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Soluzione: penso anche che sia possibile concatenare i metodi sui QuerySet. Prova questo:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Questo dovrebbe darti il set che stai cercando.
Da Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Per evitare errori comuni durante l'utilizzo exclude
, ricordare:
È possibile non aggiungere più condizioni in una escludere () blocco come filter
. Per escludere più condizioni, è necessario utilizzare più exclude ()
Esempio
Errato :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' ', profile__avt =' ')
Corretto :
User.objects.filter (email='example@example.com '). Escludere (profile__nick_name =' '). Escludere (profile__avt =' ')
Puoi semplicemente farlo:
Name.objects.exclude(alias="").exclude(alias=None)
È davvero così semplice. filter
è usato per abbinare ed exclude
è per abbinare tutto tranne ciò che specifica. Ciò valuterebbe in SQL come NOT alias='' AND alias IS NOT NULL
.
alias=""
) e NULL ( alias=None
) dalla query. I tuoi includono esempi con Name(alias=None)
.
.filter(alias!="")
ma non al titolo. Ho modificato la mia risposta. Tuttavia, i campi di caratteri non dovrebbero consentire valori NULL e utilizzare la stringa vuota per un non valore (come da convenzione).
questo è un altro modo semplice per farlo.
Name.objects.exclude(alias=None)
None
non è la stessa cosa di ""
.
OR
(solo in questo caso), produce un SQLAND
. Vedere questa pagina per riferimento: docs.djangoproject.com/en/dev/topics/db/queries/… Il vantaggio del concatenamento è che è possibile combinareexclude
efilter
modellare condizioni di query complesse. Se si desidera modellare un SQL reale,OR
è necessario utilizzare un oggetto Django Q: docs.djangoproject.com/en/dev/topics/db/queries/… Modifica la modifica per riflettere ciò, poiché la risposta è gravemente fuorviante così com'è .