50

我知道,我可以从 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

如果没有,那么建议一个最好的方法来做到这一点。提前致谢。

4

4 回答 4

103

从 Django 1.8 开始,可以使用:

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

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

于 2015-12-29T07:27:48.917 回答
25

此答案已过时,请使用 django >= 1.8遵循最高投票解决方案

我找到了使用 .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

于 2012-08-19T11:54:53.160 回答
5

这适用于 postgresql,但也许它对其他数据库也有用:

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

于 2010-08-04T19:37:37.477 回答
0

让我们举一个例子,您必须对用户模型中的字段“first_name”进行不区分大小写的排序

# Importing the Lower Function
from django.db.models.functions import Lower


#For ordering by Ascending order
User.objects.all().order_by(Lower('first_name'))

#For ordering by Descending order
User.objects.all().order_by(Lower('first_name').desc())

Lower函数将所有“ first_name”值转换为小写,然后对其进行相应排序。

于 2021-05-16T16:29:02.923 回答