Je voudrais filtrer mon modèle sur la base de la longueur du texte. Quelque chose comme
MyModel.objects.filter(len(text) > 10)
où text est un champ Char ou Text dans le modèle MyModel
Je voudrais filtrer mon modèle sur la base de la longueur du texte. Quelque chose comme
MyModel.objects.filter(len(text) > 10)
où text est un champ Char ou Text dans le modèle MyModel
Pour Django >= 1.8, vous pouvez utiliser la fonction Fonction de longueur qui est celui de @Pratyush. CHAR_LENGTH()
sous le capot pour MySQL, ou LENGTH()
pour d'autres bases de données :
from django.db.models.functions import Length
qs = MyModel.objects.annotate(text_len=Length('text_field_name')).filter(
text_len__gt=10)
Une solution intéressante pour Django >= 1.9 est possible en enregistrant la fonction intégrée suivante Length
en tant que Transformer para CharField
recherche.
Registre la transformation dans le projet une fois. (Le meilleur endroit est probablement models.py).
from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length, 'length')
Utilice :
result = MyModel.objects.filter(text__length__gt=10)
Voir exactement le même exemple dans les documents relatifs à La longueur comme transformation .
Il fonctionne correctement pour tous les backends, compilés par LENGTH()
pour la plupart des backends et par CHAR_LENGTH()
pour MySQL. Il est ensuite enregistré automatiquement pour toutes les sous-classes de CharField, par exemple pour EmailField. Le site TextField
doivent être enregistrés individuellement. Il est sûr d'enregistrer le nom "longueur", car un nom de transformation ne pourrait jamais ombrager ou être ombragé par un nom de champ de même nom ou un nom de champ connexe.
Le seul inconvénient pourrait être un casse-tête de lisibilité : d'où vient la "longueur" ? (La recherche est globale, mais la même chose peut heureusement être enregistrée de façon sûre et répétée dans plus de modules, si cela est utile pour la lisibilité, sans aucune surcharge possible au moment de l'exécution de la requête).
Une autre solution tout aussi valable est le plaques de cuisson L'exemple ci-dessus est plus court si un enregistrement compte et si une requête similaire n'est pas utilisée de manière répétée.
Vous pouvez utiliser le filtre regex pour rechercher du texte d'une longueur particulière :
MyModel.objects.filter(text__regex = r'.{10}.*')
Attention : pour MySQL, la longueur maximale est de 255. Sinon, une exception est levée :
DatabaseError: (1139, "Got error 'invalid repetition count(s)' from regexp")
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.