Django ORM将字段转Integer后降序排序报字段解析错误如何解决
报错原因
你触发错误的核心原因是把order_by()的降序标记-错误写在了Cast()函数的字段参数内部:
Cannot resolve keyword '-event_rating' into field.
ORM解析Cast('-event_rating', IntegerField())时,会直接把字符串'-event_rating'当做模型的真实字段名去匹配,不会识别里面的负号为排序标记,自然找不到对应字段抛出错误。
正确实现方法
Cast()只负责字段类型转换,接收的第一个参数必须是不带任何排序修饰的原始字段名;降序逻辑要作用在整个Cast表达式外层,有两种等效的正确写法:
- 推荐写法:调用表达式自带的
.desc()方法标记降序,语义更明确 - 简洁写法:和普通字段降序逻辑一致,直接在整个Cast表达式前加
-标记
修正后的可运行代码如下:
from django.db.models import IntegerField from django.db.models.functions import Cast # 推荐写法 Events.objects.filter(start_time__lte=some_start_time)\ .exclude(event_id__in=excluded_event_ids)\ .order_by( '-start_time', Cast('event_rating', IntegerField()).desc() ) # 等效简洁写法 Events.objects.filter(start_time__lte=some_start_time)\ .exclude(event_id__in=excluded_event_ids)\ .order_by( '-start_time', -Cast('event_rating', IntegerField()) )
两种写法最终生成的SQL逻辑完全一致:先按start_time字段倒序排,同时间的记录再按转为整数后的event_rating字段倒序排,不会触发字段解析错误。
内容的提问来源于stack exchange,提问作者Mukul Anand
相关产品推荐
相关产品推荐

