Filtrage des noms vides ou NULL dans un jeu de requête

J’ai first_name, last_name & alias (optionnel) que je dois rechercher. J’ai donc besoin d’une requête pour me donner tous les noms qui ont un jeu d’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 des valeurs nulles et des chaînes vides, la méthode préférée consiste à regrouper les conditions comme suit:

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

Le chaînage de ces méthodes vérifie indépendamment chaque condition: dans l’exemple ci-dessus, nous excluons les lignes où l’ alias est nul ou une chaîne vide. Vous obtenez donc tous les objects Name qui ont un champ non-null 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 objects 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 true 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) 

Sinon, si votre logique est plus complexe que cela, vous pouvez utiliser les objects 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 les documents de Django.

En passant: Mes exemples SQL ne sont qu’une analogie – le code SQL généré sera probablement différent. Vous comprendrez mieux le fonctionnement des requêtes Django en examinant le SQL qu’elles génèrent.

Tout d’abord, les documents Django recommandent fortement de ne pas utiliser de 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 enchaîner des méthodes sur QuerySets. Essaye ça:

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

Cela devrait vous donner l’ensemble que vous recherchez.

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

De Django 1.8,

 from django.db.models.functions import Length Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0) 

Vous pouvez simplement faire ceci:

 Name.objects.exclude(alias="") 

Les réponses semblent danser autour de cela, mais c’est vraiment aussi simple que cela. filter est utilisé pour correspondre et exclude pour correspondre à tout sauf à ce qu’il spécifie.