2010-08-04 46 views
27

我知道,我可以從DJango ORM運行不區分大小寫的搜索。像,django-orm不區分大小寫的順序由

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

還有,我可以獲取他們作爲

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) 

是否有不區分大小寫的獲取直接的方式?如我想要的序列那樣

# desired sequence: jake, Jake, sulley, Sulley 

如果不是,那麼建議一個最好的方法來做到這一點。提前致謝。

回答

23

我找到解決方案使用.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') 

原文鏈接:

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

+1

這在遍歷關係時不起作用,即「name__something」,但是您可以使其與Lower函數一起工作,因爲django 1.8:'from django.db.models.functions import Lower'and'MyModelName.objects.order_by(Lower ('name_something'))'這裏是https://docs.djangoproject.com/en/1.9/_modules/django/db/models/functions/#Lower – romainm 2016-02-26 16:35:10

6

這是PostgreSQL的,但也許它會爲其他數據庫是太有用:

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

+0

但這將失敗,其他數據庫的。如果我需要從連接表中的字段排序,它會變得複雜,對嗎? – simplyharsh 2010-08-04 20:01:32

+0

必須接受一個最有幫助的。謝謝。 – simplyharsh 2010-08-05 08:05:48

+0

如果答案不符合您的要求,您不必接受任何內容。不幸的是,Django沒有提供你想要的機制。你可以嘗試使用'extra'來處理,這樣就可以達到你想要的效果。這應該適用於任何分貝。或者你可以寫一個原始的SQL。 – gruszczy 2010-08-05 08:43:20

37

由於Django的1.8,可以用:

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

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

+0

這是一個更好的解決方案,用於新的Django版本。謝謝! – Chris 2017-02-25 18:12:53

+0

是否有可能在多列中使用Lower?我似乎只能讓它與一列一起工作。 – Ben 2017-06-15 23:57:28

+0

這是可能的:User.objects.order_by(Lower('username'),Lower('email')) – 2017-06-19 07:50:13