django-orm不区分大小写的顺序

sim*_*rsh 33 django case-insensitive django-orm fetch

我知道,我可以从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")
Run Code Online (Sandbox Code Playgroud)

而且,我可以把它们当作

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)
Run Code Online (Sandbox Code Playgroud)

对于不区分大小写的提取有直接的方法吗?就像我想要一个序列一样

# desired sequence: jake, Jake, sulley, Sulley
Run Code Online (Sandbox Code Playgroud)

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

uri*_*i.z 69

从Django 1.8开始,它有可能:

from django.db.models.functions import Lower
MyModel.objects.order_by(Lower('myfield'))
Run Code Online (Sandbox Code Playgroud)

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

  • 对于降序使用: MyModel.objects.order_by(Lower('myfield').desc()) (3认同)
  • 有可能: User.objects.order_by(Lower('username'), Lower('email')) (2认同)

Tro*_*yhy 26

这个答案已经过时,用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')
Run Code Online (Sandbox Code Playgroud)

原始链接:

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