la négation de la requête Django
Question
Je sais comment construire des filtres et des objets Q dans django, mais je ne sais pas comment les opérateurs nier que l'API fournit, par exemple pour l'opérateur CONTAINS je voudrais quelque chose comme notcontains.
par exemple.
q=Q(name__notcontains="SomeString")
me obtenir tous les objets dont le nom ne contient pas « SomeString ».
Y at-il une syntaxe que je suis absent?
Thankyou.
La solution
Vous pouvez utiliser exclude()
à la place de filter()
:
Entry.objects.exclude(name__contains="SomeString")
( "donnez-moi toutes les entrées SAUF ceux names
contenant "SomeString")
Et quand traiter avec un objet Q, vous pouvez utiliser le symbole « ~ » devant un objet Q pour représenter la négation. Par exemple, la déclaration suivante signifie « me donner toutes les entrées avec names
contenant « Elephant », mais ne contenant pas « SomeString »:
Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
Dans certains cas, vous pouvez utiliser les deux méthodes:
Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
( "me donner toutes les entrées, sauf ceux avec names
contenant "Elephant", mais ne contenant pas "SomeString")
Autres conseils
Soit l'utilisation exclude
comme Hank suggère ou, pour le cas particulier de contains
, utilisez Q (name__regex = r '! (SomeString)) si vous avez vraiment vraiment besoin d'utiliser le filter
. Attention cependant que regex
n'est pas la base de données agnostique, vérifiez que la syntaxe votre base prend en charge d'abord.