Django中实现order by FIELD

本文介绍了如何在Django中使用ORM实现类似原生SQL的FIELD排序功能。当需要根据status字段['success','fail','delete']的特定顺序排序时,可以利用Django的Case和When表达式,将每个状态映射为整数并进行排序。通过 Tasks.objects.filter().annotate() 和 order_by('Status') 方法,实现了自定义排序的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景:

在我们开发过程中,有时候会遇到需要对指定数据库字段中的值按照某个自定义的顺序进行排序,如:查询结果需要按照status字段值['success', 'fail', 'delete']进行排序

二、如果是通过原生sql进行实现,那么可以如下实现

select * from tasks order by FIELD(status, 'success', 'fail', 'delete') asc;

三、那么如果是在Django中使用ORM,该怎么实现呢?

查找了很多文章博客,没有找到很好的方法,我最后通过了如下的方式进行代替实现:

task_list = Tasks.objects.filter(**params).annotate(
            Status=Case(When(status='success', then=1),
                        When(status='fail', then=2),
                        When(status='delete', then=3),
                        default=Value(4),
                        output_field=IntegerField()
                        )
        ).order_by('Status')

以上是本人自己的实践,如果有任何疑问或者更好的建议欢迎评论联系,非常感谢~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值