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?
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.
Name.objects.filter(alias__gt='',alias__isnull=False)
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.
De Django 1.8,
from Django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
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 =' ')
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
.
c'est un autre moyen simple de le faire.
Name.objects.exclude(alias=None)