644 votes

Filtrage des noms vides ou NULL dans un queryset

J'ai un prénom, un nom et un alias (facultatif) que je dois rechercher. J'ai donc besoin d'une requête qui me donne tous les noms pour lesquels un alias a été défini.

Seulement si je pouvais le faire :

Name.objects.filter(alias!="")

Alors, quel est l'équivalent de ce qui précède ?

1140voto

Sasha Chedygov Points 36783

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é.

80voto

jbofill Points 136
Name.objects.filter(alias__gt='',alias__isnull=False)

42voto

b3ng0 Points 175

Tout d'abord, la documentation de Django recommande fortement de ne pas utiliser de valeurs NULL pour les champs basés sur des chaînes de caractères tels que CharField ou TextField. Lisez la documentation pour obtenir l'explication.

Solution : Vous pouvez également enchaîner les méthodes sur les QuerySets, je pense. Essayez ceci :

Name.objects.exclude(alias__isnull=True).exclude(alias="")

Cela devrait vous donner l'ensemble que vous recherchez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X