2010-08-04 5 views
27

Ich weiß, ich kann eine case unsensitive Suche von DJango ORM ausführen. Wie,django-orm case-insensitive order von

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

Und auch, kann ich sie als

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) 

ein direkter Weg für eine Groß- und Kleinschreibung holen Gibt es holen ?? Wie in ich will eine Sequenz wie

# desired sequence: jake, Jake, sulley, Sulley 

Wenn nicht, dann schlagen Sie einen besten Weg vor, es zu tun. Danke im Voraus.

Antwort

23

Ich fand Lösung .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') 

ursprünglichen Link:

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

+1

Dies wird nicht funktionieren, wenn Sie die Beziehung durchlaufen, dh "name__etwas", aber Sie können es mit der Lower-Funktion arbeiten, da django 1.8: 'from django.db.models.functions Lower importieren' und 'MyModelName.objects.order_by (Lower ('name_etwas') 'hier ist es https://docs.djangoproject.com/de/1.9/_modules/django/db/models/functions/#Lower – romainm

6

Dies ist für postgresql, aber vielleicht wird es auch für andere Datenbanken zu nützlich sein:

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

+0

Das wird aber mit anderer DB scheitern. Auch würde es komplex werden, wenn ich Felder von verbundenen Tabellen bestellen muss, nicht wahr? – simplyharsh

+0

Ich muss eine sehr hilfreiche annehmen. Vielen Dank. – simplyharsh

+0

Sie müssen nichts akzeptieren, wenn die Antwort Sie nicht zufriedenstellt. Leider bietet django momentan keinen Mechanismus für das, was Sie wollen. Sie können versuchen, mit "Extra" zu arbeiten und auf diese Weise zu erreichen, was Sie wollen. Dies sollte bei jeder db funktionieren. Oder Sie können eine rohe SQL schreiben. – gruszczy

37

Da Django 1.8 ist es möglich, mit:

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

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

+0

Dies ist eine bessere Lösung für neue Django-Versionen. Vielen Dank! – Chris

+0

Kann Lower mit mehreren Spalten verwendet werden? Ich kann es nur mit einer Kolumne funktionieren lassen. – Ben

+0

Es ist möglich: User.objects.order_by (Lower ('Benutzername'), Lower ('E-Mail')) –