Tu pourrais faire ça :
Name.objects.exclude(alias__isnull=True)
Si vous devez exclure les valeurs nulles et des chaînes vides, la meilleure façon de procéder est d'enchaîner les conditions comme suit :
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
L'enchaînement de ces méthodes permet de vérifier chaque condition indépendamment : dans l'exemple ci-dessus, nous excluons les lignes où alias
est soit nulle ou une chaîne vide, donc vous obtenez tous les Name
qui ont un objet non nul et non vide. alias
champ. Le SQL généré ressemblerait à quelque chose comme :
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Vous pouvez également passer plusieurs arguments à un seul appel à la fonction exclude
ce qui garantirait que seuls les objets qui répondent aux critères de chaque sont exclus :
Name.objects.exclude(some_field=True, other_field=True)
Ici, les rangées dans lesquelles some_field
et other_field
sont vrais sont exclus, de sorte que nous obtenons toutes les lignes où les deux champs ne sont pas vrais. Le code SQL généré ressemblerait un peu à ceci :
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Si votre logique est plus complexe que cela, vous pourriez faire quelque chose comme ceci, bien que je ne le recommande qu'en dernier recours :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Pour plus d'informations, voir cette page et cette page dans la documentation de Django.
En passant : Mes exemples SQL sont juste une analogie - le code SQL réellement généré sera probablement différent. Vous aurez une meilleure compréhension du fonctionnement des requêtes Django en regardant le code SQL généré.