2010-08-04 12 views
27

Lo sé, puedo ejecutar una búsqueda insensible a mayúsculas/minúsculas desde DJango ORM. Al igual que,orden insensible a django-orm por

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

Y también, que puedo pedir como

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) 

¿Hay una manera directa para un caso-insensibles fetch ?? Como en Quiero una secuencia como

# desired sequence: jake, Jake, sulley, Sulley 

De lo contrario, sugiera la mejor manera de hacerlo. Gracias por adelantado.

Respuesta

23

He encontrado solución utilizando .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') 

vínculo original:

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

+1

Esto no funcionará al atravesar una relación, es decir, "nombre__algo", sin embargo, puede hacer que funcione con la función Lower ya que django 1.8: 'desde django.db.models.functions import Lower' y 'MyModelName.objects.order_by (Lower ('name_something')) 'aquí está https://docs.djangoproject.com/en/1.9/_modules/django/db/models/functions/#Lower – romainm

6

Esto es para PostgreSQL, pero tal vez va a ser útil para otras bases de datos también:

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

+0

pero esto va a fallar con otro bloque de datos de. También se volvería complejo si tuviera que ordenar en campos de tablas unidas, ¿verdad? – simplyharsh

+0

Tiene que aceptar uno de los más útiles. Gracias. – simplyharsh

+0

No tiene que aceptar nada, si la respuesta no le satisface. Desafortunadamente, django no proporciona el mecanismo para lo que quieres ahora. Puedes intentar trabajar con 'extra' y así lograr lo que quieres. Esto debería funcionar en cualquier db. O puede escribir un sql en bruto. – gruszczy

37

Desde Django 1.8 es posible con:

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

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

+0

Esta es una mejor solución para las nuevas versiones de Django. ¡Gracias! – Chris

+0

¿Es posible usar Lower con múltiples columnas? Solo puedo hacer que funcione con una columna. – Ben

+0

Es posible: User.objects.order_by (Lower ('username'), Lower ('email')) –

Cuestiones relacionadas