【问题标题】:django-orm case-insensitive order bydjango-orm 不区分大小写的顺序
【发布时间】:2011-03-25 10:55:48
【问题描述】:

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

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

【问题讨论】:

    标签: django case-insensitive fetch django-orm


    【解决方案1】:

    从 Django 1.8 开始,可以使用:

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

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

    【讨论】:

    • 对于新的 Django 版本,这是一个更好的解决方案。谢谢!
    • 可以多列使用Lower吗?我似乎只能让它与一列一起工作。
    • 有可能:User.objects.order_by(Lower('username'), Lower('email'))
    • models.py 类元:ordering = [Lower('name')]
    • 降序使用:MyModel.objects.order_by(Lower('myfield').desc())
    【解决方案2】:

    此答案已过时,请使用 django >= 1.8 关注 top voted solution

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

    【讨论】:

    • 这在遍历关系时不起作用,即 "name__something" ,但是您可以使其与 django 1.8 以来的 Lower 函数一起使用:'from django.db.models.functions import Lower' 和' MyModelName.objects.order_by(Lower('name_something'))' 这里是docs.djangoproject.com/en/1.9/_modules/django/db/models/…
    【解决方案3】:

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

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

    【讨论】:

    • 但这将与其他数据库失败。如果我需要对连接表中的字段进行排序,它也会变得复杂,对吗??
    • 如果答案不满足你,你不必接受任何东西。不幸的是,django 没有提供你现在想要的机制。您可以尝试使用extra,这样可以尝试实现您想要的。这应该适用于任何数据库。或者你可以写一个原始的 sql。
    【解决方案4】:

    让我们举一个例子,您必须对 User 模型中的字段 "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-08-29
      • 1970-01-01
      • 2012-08-16
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2019-06-22
      • 2010-10-29
      相关资源
      最近更新 更多