43 votes

Django-orm trier par ordre insensible à la casse

Je sais, je peux exécuter une recherche insensible à la casse à partir de DJango ORM. Comme,

User.objects.filter(first_name__contains="jake")
User.objects.filter(first_name__contains="sulley")
User.objects.filter(first_name__icontains="Jake")
User.objects.filter(first_name__icontains="Sulley")

Et aussi, je peux les récupérer comme

user_list = User.objects.all().order_by("first_name")
# séquence: (Jake, Sulley, jake, sulley)
user_list = User.objects.all().order_by("-first_name") # pour inverser
# séquence: (sulley, jake, Sulley, Jake)

Y a-t-il un moyen direct pour une récupération insensible à la casse ?? Comme je veux une séquence comme

# séquence souhaitée : jake, Jake, sulley, Sulley

Si ce n'est pas le cas, alors suggérez le meilleur moyen de le faire. Merci d'avance.

92voto

fitz Points 69

Depuis Django 1.8, il est possible avec:

from django.db.models.functions import Lower
MyModel.objects.order_by(Lower('myfield'))

https://code.djangoproject.com/ticket/6498

26voto

Troyhy Points 141

Cette réponse est obsolète, suivez la solution la plus votée avec django >= 1.8

J'ai trouvé une solution en utilisant .extra

class NomDeMonModele(models.Model):
   est_mien = models.BooleanField(default=False)
   nom = models.CharField(max_length=100)

NomDeMonModele.objects.filter( est_mien=1 ).extra(\
    select={'lower_nom':'lower(nom)'}).order_by('lower_nom')

lien original:

http://naorrosenberg.blogspot.fi/2011/04/django-models-orderby-charfield-case.html

5voto

gruszczy Points 14097

Ceci est pour PostgreSQL, mais cela pourrait également être utile pour d'autres bases de données :

http://scottbarnham.com/blog/2007/11/20/case-insensitive-ordering-with-django-and-postgresql/

0voto

Ranjan MP Points 181

Prenons un exemple où vous devez faire un ordre insensible à la casse du champ "first_name" du modèle User

# Importation de la fonction Lower
from django.db.models.functions import Lower

# Pour l'ordonnancement par ordre croissant
User.objects.all().order_by(Lower('first_name'))

# Pour l'ordonnancement par ordre décroissant
User.objects.all().order_by(Lower('first_name').desc())

La fonction Lower convertit toutes les valeurs de "first_name" en minuscules, puis les ordonne en conséquence.

Prograide.com

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.

Powered by:

X