首页 > 解决方案 > 如何使用 Lower() 以相反的顺序对查询集进行排序

问题描述

如果我在对查询集进行排序时不使用 Lower() 函数,那么我的查询集会分别对大写和小写值进行排序。因此,如果我的查询集包含“Apples, Bananas, cherries, Oranges”并且我使用了,order_by('name')那么我得到:“Apples, Bananas, Oranges, cherries”。如果我使用order_by(Lower('name')),那么一切正常。

我的问题是我的视图MyModel.objects.all().order_by(order_by)使用用户指定的 GET 变量设置 order_by 进行排序。GET 变量尝试以相反顺序排序时的 Lower() 错误,例如 order_by='-name'

我尝试了以下代码,但在 order_by='-name' 时出现回溯错误,但在 order_by='name' 时工作正常:MyModel.objects.all().order_by(Lower(order_by))

然后我尝试了一些更聪明的方法,但是现在当 order_by='-name' 然后查询集停止按字母顺序排序,只使用对象 ID 进行排序。但是当 order_by='name' 时排序很好。

视图.py

@login_required
def merchantgroups_show_all(request):
    order_by = request.GET.get('order_by', 'name')




    from django.db.models.functions import Lower
    if order_by[0]=='-':
        order_by = order_by[1:]
        merchant_groups = MerchantGroup.objects.all().order_by('-'+Lower(order_by))
    else:
        merchant_groups = MerchantGroup.objects.all().order_by(Lower(order_by))




    paginator = Paginator(merchant_groups,20)
    page = request.GET.get('page')
    merchant_groups2 = paginator.get_page(page)
    return render(request, 'monzo/merchantgroups_show_all.html', {'merchant_groups': merchant_groups2,})

当 GET 变量 order_by 以负值开头时,如何让 Lower() 工作有什么想法吗?

标签: django

解决方案


我认为您需要annotate使用降低的名称和顺序:

merchant_groups = MerchantGroup.objects.all().annotate(lower_name=Lower("name")).order_by("-lower_name")

推荐阅读