Dans le modèle Django QuerySets, je vois qu'il y a un __gt
et __lt
pour les valeurs comparatives, mais y a-t-il un __ne
/ !=
/ <>
( pas égal ?)
Je veux filtrer en utilisant un pas égal à:
Exemple:
Model:
bool a;
int x;
Je voudrais
results = Model.objects.exclude(a=true, x!=5)
La !=
syntaxe n'est pas correcte. J'ai essayé __ne
, <>
.
J'ai fini par utiliser:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
a=true
abord, puis applique lex=5
filtre sur les autres. La requête prévue ne nécessitait que ceux aveca=true
etx!=5
. La différence étant que tous ceux qui onta=true
etx=5
sont également filtrés.Réponses:
Peut-être que les objets Q pourraient être utiles pour ce problème. Je ne les ai jamais utilisés, mais il semble qu'ils puissent être annulés et combinés un peu comme les expressions python normales.
Mise à jour: je viens de l'essayer, cela semble assez bien fonctionner:
la source
Votre requête semble avoir un double négatif, vous voulez exclure toutes les lignes où x n'est pas 5, donc en d'autres termes, vous voulez inclure toutes les lignes où x EST 5. Je pense que cela fera l'affaire.
Pour répondre à votre question spécifique, il n'y a pas de "pas égal à", mais c'est probablement parce que django a à la fois des méthodes "filtrer" et "exclure" disponibles, vous pouvez donc toujours changer de logique pour obtenir le résultat souhaité.
la source
results = Model.objects.filter(a=true).exclude(x=5)
exclude
et lesfilter
appels n'ont fait aucune différence significative. L'ordre des conditions dans laWHERE
clause change, mais comment est-ce important?la
field=value
syntaxe dans les requêtes est un raccourci pourfield__exact=value
. C'est-à-dire que Django place les opérateurs de requête sur les champs de requête dans les identifiants . Django prend en charge les opérateurs suivants:Je suis sûr qu'en les combinant avec les objets Q comme le suggère Dave Vogt et en utilisant
filter()
ouexclude()
comme Jason Baker le suggère, vous obtiendrez exactement ce dont vous avez besoin pour à peu près n'importe quelle requête possible.la source
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
et ça marche.icontains
,iexact
et similaire signifie «ignorer la sensibilité à la casse». Ce n'est pas pour "inverse".exclude()
plusieurs termes, vous souhaiterez peut-être composer la proposition avec l'OR
opérateur, par exempleexclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
afin d'exclure les résultats dans les deux conditions.Il est facile de créer une recherche personnalisée avec Django 1.7. Il existe un
__ne
exemple de recherche dans la documentation officielle de Django .Vous devez d'abord créer la recherche elle-même:
Ensuite, vous devez l'enregistrer:
Et maintenant, vous pouvez utiliser la
__ne
recherche dans vos requêtes comme ceci:la source
Dans Django 1.9 / 1.10, il y a trois options.
Chaîne
exclude
etfilter
Utiliser des
Q()
objets et l'~
opérateurEnregistrer une fonction de recherche personnalisée
Le
register_lookup
décorateur a été ajouté dans Django 1.8 et permet une recherche personnalisée comme d'habitude:la source
Alors que les modèles, vous pouvez filtrer avec
=
,__gt
,__gte
,__lt
,__lte
, vous ne pouvez pas utiliserne
,!=
ou<>
. Cependant, vous pouvez obtenir un meilleur filtrage lors de l'utilisation de l'objet Q.Vous pouvez éviter de chaîner
QuerySet.filter()
etQuerySet.exlude()
, et utiliser ceci:la source
Décision de conception en attente. Pendant ce temps, utilisez
exclude()
Le tracker de problème Django a l' entrée remarquable # 5763 , intitulée "Queryset n'a pas d'opérateur de filtre" différent " . Il est remarquable car (en avril 2016) il a été "ouvert il y a 9 ans" (à l'âge de pierre de Django), "fermé il y a 4 ans", et "modifié depuis 5 mois".
Lisez la discussion, c'est intéressant. Fondamentalement, certaines personnes soutiennent
__ne
qu'il faudrait ajouter tandis que d'autres disent queexclude()
c'est plus clair et ne__ne
devrait donc pas être ajouté.(Je suis d'accord avec le premier, car le dernier argument équivaut à peu près à dire que Python ne devrait pas avoir
!=
parce qu'il l'a fait==
etnot
déjà ...)la source
Utilisation d'exclusion et de filtre
la source
Vous devez utiliser
filter
etexclude
aimer cecila source
Le dernier bit de code exclura tous les objets où x! = 5 et a est True. Essaye ça:
N'oubliez pas que le signe = dans la ligne ci-dessus attribue la valeur False au paramètre a et le nombre 5 au paramètre x. Il ne s'agit pas de vérifier l'égalité. Ainsi, il n'y a vraiment aucun moyen d'utiliser le symbole! = Dans un appel de requête.
la source
results = Model.objects.filter(a__in=[False,None],x=5)
la source
Django-model-values (divulgation: auteur) fournit une implémentation de la recherche NotEqual , comme dans cette réponse . Il fournit également un support syntaxique pour cela:
la source
Ce que vous recherchez, ce sont tous les objets qui ont soit
a=false
oux=5
. Dans Django,|
sert d'OR
opérateur entre les ensembles de requêtes:la source
Cela donnera le résultat souhaité.
pour pas égal, vous pouvez utiliser
~
sur une requête égale. évidemment,Q
peut être utilisé pour atteindre la requête égale.la source
Q(a=True) and ~Q(x=5)
serait évalué~Q(x=5)
comme argument pour.exclude
. Veuillez lire: docs.python.org/3/reference/expressions.html#boolean-operations et docs.python.org/3/reference/… .Attention aux nombreuses réponses incorrectes à cette question!
La logique de Gerard est correcte, bien qu'elle renvoie une liste plutôt qu'un ensemble de requêtes (ce qui peut ne pas avoir d'importance).
Si vous avez besoin d'un ensemble de requêtes, utilisez Q:
la source