django - 如何使用 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() 工作有什么想法吗?
解决方案
我认为您需要annotate
使用降低的名称和顺序:
merchant_groups = MerchantGroup.objects.all().annotate(lower_name=Lower("name")).order_by("-lower_name")
推荐阅读
- html - 要求用户将鼠标悬停在图片上一定时间
- javascript - 如何在Javascript中动态更改动画中使用的变量
- bash - 如果当前没有运行,我如何只运行 ffmpeg
- reactjs - 如何将子组件连接到 redux 连接组件?
- php - 为什么 update 或 save() 在 laravel 5.8 中不起作用?
- postgresql - 如何使用触发器在表中实现时间约束?我必须一次修改两行
- java - Spring boot 配置数据源失败:未指定“url”属性
- c# - LINQ 选择返回 Null
- sql - 以 AB_ 为前缀的 ID 字段(示例:AB_00yyhhgdbdbd)
- javascript - 任何人都知道为什么这个文件记录在本地主机上而不是在 github 服务器上?