2010-08-04 12 views
27

Lo so, posso eseguire una ricerca case sensitive da DJango ORM. Come,django-orm case-insensitive order by

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") 

E anche, posso li Visualizza come

user_list = User.objects.all().order_by("first_name") 
# sequence: (Jake, Sulley, jake, sulley) 
user_list = User.objects.all().order_by("-first_name") # for reverse 
# sequence: (sulley, jake, Sulley, Jake) 

C'è un modo diretto per un caso-insensitive fetch ?? Come in Voglio una sequenza come

# desired sequence: jake, Jake, sulley, Sulley 

In caso contrario, suggerire un modo migliore per farlo. Grazie in anticipo.

risposta

23

ho trovato soluzione con .extra

class MyModelName(models.Model): 
    is_mine = models.BooleanField(default=False) 
    name = models.CharField(max_length=100) 


MyModelName.objects.filter(is_mine=1).extra(\ 
    select={'lower_name':'lower(name)'}).order_by('lower_name') 

link originale:

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

+1

Questo non funzionerà quando si attraversa una relazione, ad esempio "nome__something", tuttavia è possibile farlo funzionare con la funzione Lower poiché django 1.8: 'from django.db.models.functions importa Lower' e 'MyModelName.objects.order_by (Lower ('name_something')) 'qui è https://docs.djangoproject.com/en/1.9/_modules/django/db/models/functions/#Lower – romainm

6

questo è per PostgreSQL, ma forse sarà utile per altri database anche:

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

+0

Ma questo non riuscirà con altri DB. Inoltre sarebbe complesso se avessi bisogno di ordinare sui campi da tabelle unite, giusto ?? – simplyharsh

+0

Devo accettare il più utile. Grazie. – simplyharsh

+0

Non devi accettare nulla, se la risposta non ti soddisfa. Sfortunatamente, Django non fornisce un meccanismo per quello che vuoi adesso. Puoi provare a lavorare con 'extra' e in questo modo cerca di ottenere quello che vuoi. Questo dovrebbe funzionare su qualsiasi db. O puoi scrivere un sql raw. – gruszczy

37

Dal Django 1.8 è possibile con:

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

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

+0

Questa è una soluzione migliore per le nuove versioni di Django. Grazie! – Chris

+0

È possibile utilizzare Lower con più colonne? Posso solo sembrare che funzioni con una colonna. – Ben

+0

È possibile: User.objects.order_by (Lower ('username'), Lower ('email')) –