web-dev-qa-db-fra.com

Filtrage des noms vides ou NULL dans un ensemble de requêtes

J'ai le prénom, le nom et l'alias (facultatif) que je dois rechercher. Donc, j'ai besoin d'une requête pour me donner tous les noms qui ont un alias.

Seulement si je pouvais faire:

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

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

435
un33k

Vous pourriez faire ceci:

Name.objects.exclude(alias__isnull=True)

Si vous devez exclure les valeurs NULL et les chaînes , la meilleure façon de le faire consiste à enchaîner les conditions de la manière suivante:

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

En enchaînant ces méthodes, on vérifie fondamentalement chaque condition séparément: dans l'exemple ci-dessus, nous excluons les lignes où alias est nul ou une chaîne vide, vous obtenez donc tous les objets Name qui ont un champ alias non nul et non vide. Le SQL généré ressemblerait à quelque chose comme:

SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""

Vous pouvez également transmettre plusieurs arguments à un seul appel à exclude, ce qui garantirait que seuls les objets répondant à toutes les conditions soient exclus:

Name.objects.exclude(some_field=True, other_field=True)

Ici, les lignes dans lesquelles some_field et other_field sont vraies sont exclues. Nous obtenons donc 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)

Alternativement, si votre logique est plus complexe que cela, vous pouvez utiliser les objets Q de Django :

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

Soit dit en passant: Mes exemples SQL ne sont qu’une analogie: le code SQL généré sera probablement différent. Vous obtiendrez une meilleure compréhension du fonctionnement des requêtes Django en examinant le code SQL qu'elles génèrent.

786
Sasha Chedygov
Name.objects.filter(alias__gt='',alias__isnull=False)
37
jbofill

Premièrement, la documentation Django recommande fortement de ne pas utiliser les valeurs NULL pour les champs basés sur des chaînes tels que CharField ou TextField. Lisez la documentation pour l'explication:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

Solution: Je pense que vous pouvez également chaîner des méthodes sur des ensembles de requêtes. Essaye ça:

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

Cela devrait vous donner l’ensemble que vous recherchez.

36
b3ng0

De Django 1.8,

from Django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
5

Pour éviter les erreurs courantes lors de l’utilisation de exclude, rappelez-vous:

Vous pouvez ne pas ajouter plusieurs conditions dans n exclude () bloquer comme filter. Pour exclure plusieurs conditions, vous devez utiliser plusieurs exclude () () .

Exemple

Incorrect:

User.objects.filter (email='[email protected] '). Exclude (profile__nick_name =' ', profile__avt =' ')

Correct:

User.objects.filter (email='[email protected] '). Exclude (profile__nick_name =' '). Exclude (profile__avt =' ')

2
HoangYell

Vous pouvez simplement faire ceci:

Name.objects.exclude(alias="").exclude(alias=None)

C'est vraiment aussi simple que cela. filter est utilisé pour faire correspondre et exclude doit correspondre à tout sauf ce qu'il spécifie. Ceci serait évalué en SQL sous le nom de NOT alias='' AND alias IS NOT NULL.

0
Tim Tisdall

c'est un autre moyen simple de le faire.

Name.objects.exclude(alias=None)
0
ImadOS