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.

Était-ce utile?

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

Voici le QuerySet de référence API. exclude semble faire ce que vous voulez.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top