Django order by 高级用法

  • 最近业务上出现了一个比较特殊的排序需求:推荐池的内容要排在最前面,其他的 id 升序

准备

  • 定义model

    class TestCaseWhen(models.Model):name = models.CharField(max_length=255)
    
  • 生成数据

    from test_case_when.models import TestCaseWhendata_list = []
    for num in range(10000):name = 'name:{}'.format(num)data_list.append(TestCaseWhen(name=name))TestCaseWhen.objects.bulk_create(data_list)
    
  • 检查数据

    TestCaseWhen.objects.all().count()
    Out[7]: 10000
    TestCaseWhen.objects.all().values_list('id', 'name')
    Out[8]: <QuerySet [(1, 'name:0'), (2, 'name:1'), (3, 'name:2'), (4, 'name:3'), (5, 'name:4'), (6, 'name:5'), (7, 'name:6'), (8, 'name:7'), (9, 'name:8'), (10, 'name:9'), (11, 'name:10'), (12, 'name:11'), (13, 'name:12'), (14, 'name:13'), (15, 'name:14'), (16, 'name:15'), (17, 'name:16'), (18, 'name:17'), (19, 'name:18'), (20, 'name:19'), '...(remaining elements truncated)...']>
    

需求

  • 现在有这样一个列表 TestCaseWhen id_list [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000]
  • 现在要让 TestCaseWhen 的 queryset 先按照 id_list 中的 id 位置进行排序,不在 id_list 的按照 id 升序

分析

  • 普通的 .order_by(‘id’) 肯定不能解决这个需求

  • 又不想把 queryset 转换为列表排序

  • 不谈 orm ,sql 该怎么写

  • 想到了 sql 中的 case when 函数

    SELECT id, name
    FROM test_case_when_testcasewhen
    ORDER BY CASE WHEN id = 10 THEN 0WHEN id = 20 THEN 1WHEN id = 30 THEN 2WHEN id = 40 THEN 3WHEN id = 50 THEN 4WHEN id = 60 THEN 5WHEN id = 70 THEN 6WHEN id = 80 THEN 7WHEN id = 90 THEN 8WHEN id = 100 THEN 9WHEN id = 1000 THEN 10ELSE 11END, id ASC ;
    
  • 数据库走一波

  • 这样一看好像成功了

  • 那现在需要思考的就是咋用 django orm 转化成这样的 sql 语句了

  • 先去查查文档, django case when 用法

  • but , 并没有。。。。

  • 那只能去问万能的网友了

  • 最终找到了这个

  • 运用到我们这里是这样的

    from django.db.models import Case, Whenid_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000]
    order_rule = Case(*[When(id=id, then=pos) for pos, id in enumerate(id_list)], default=len(id_list))
    qs = TestCaseWhen.objects.all().order_by(order_rule, 'id')
    
  • 打印生成的 sql

    print(qs.query)SELECT "test_case_when_testcasewhen"."id", "test_case_when_testcasewhen"."name" FROM "test_case_when_testcasewhen" ORDER BY CASE WHEN "test_case_when_testcasewhen"."id" = 10 THEN 0 WHEN "test_case_when_testcasewhen"."id" = 20 THEN 1 WHEN "test_case_when_testcasewhen"."id" = 30 THEN 2 WHEN "test_case_when_testcasewhen"."id" = 40 THEN 3 WHEN "test_case_when_testcasewhen"."id" = 50 THEN 4 WHEN "test_case_when_testcasewhen"."id" = 60 THEN 5 WHEN "test_case_when_testcasewhen"."id" = 70 THEN 6 WHEN "test_case_when_testcasewhen"."id" = 80 THEN 7 WHEN "test_case_when_testcasewhen"."id" = 90 THEN 8 WHEN "test_case_when_testcasewhen"."id" = 100 THEN 9 WHEN "test_case_when_testcasewhen"."id" = 1000 THEN 10 ELSE 11 END ASC, "test_case_when_testcasewhen"."id" ASC
  • 查看输出数据

    print(qs.values_list('id', 'name'))<QuerySet [(10, 'name:9'), (20, 'name:19'), (30, 'name:29'), (40, 'name:39'), (50, 'name:49'), (60, 'name:59'), (70, 'name:69'), (80, 'name:79'), (90, 'name:89'), (100, 'name:99'), (1000, 'name:999'), (1, 'name:0'), (2, 'name:1'), (3, 'name:2'), (4, 'name:3'), (5, 'name:4'), (6, 'name:5'), (7, 'name:6'), (8, 'name:7'), (9, 'name:8'), '...(remaining elements truncated)...']>
  • 这样看来问题就解决了

注意

  • 此处可能会因为数据量的不同而产生性能问题

Django order by 高级用法相关推荐

  1. oracle12c order by,oracle 数据库中order by 的一些高级用法

    oracle数据库中order by用法 oracle数据库中order by的一些高级用法 现有一个表,表内容如下: 以下的操作都是对该表进行的操作 1.按照名称排序(默认为升序) 实现代码: se ...

  2. oracle 数据库中order by 的一些高级用法

    oracle数据库中order by用法 oracle数据库中order by的一些高级用法 现有一个表,表内容如下: 以下的操作都是对该表进行的操作 1.按照名称排序(默认为升序) 实现代码: se ...

  3. Django基础(11): 表单集合Formset的高级用法详解

    Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息.今天小编我就介绍下Djang ...

  4. django高级用法

    使用Django意味着后台框架的几乎所有内容都会和Django产生互动,排除功能全部手撸的情况. Django 后台admin有大量的属性和方法,拥有强大的功能和自定义能力.通过完整的代码来看Djan ...

  5. Python 内置函数sorted()在高级用法

    对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...

  6. sqlalchemy(二)高级用法

    本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增加user_id这个外键(一对多). ...

  7. sql not exists用法_SQL Server 2012 高级用法(一)

    最近用到了SQL Server 相关数据库等问题,于是整理了如下SQL Server高级用法系列. 该系列不再介绍基础用法(select ,insert, update, delete, and or ...

  8. 爬虫—Requests高级用法

    Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requestsfiles = {' ...

  9. Qt QVector 详解:从底层原理到高级用法

    目录标题 引言:QVector的重要性与简介 QVector的常用接口 QVector和std::Vector 迭代器:遍历QVector 中的元素(Iterators: Traversing Ele ...

  10. 《Python 深度学习》6.3 循环神经网络的高级用法 (代码)

    # 6.3 循环神经网络的高级用法 本节将介绍提高循环神经网络的性能和泛化能力的三种高级技巧.学完本节,你将会掌握 用 Keras 实现循环网络的大部分内容.我们将在温度预测问题中介绍这三个概念.在这 ...

最新文章

  1. Android与iOS对比
  2. Vivado Logic Analyzer中VIO核的使用
  3. NotePad++列编辑
  4. 获取URL中 后面的参数值
  5. FICO蓝图设计-专题方案-财务组织架构
  6. 信号与槽是如何实现的_苹果iPhone 12信号仍弱?网友反馈打不进电话需重启解决...
  7. 爬了知乎 200 万数据,图说程序员都喜欢去哪儿工作
  8. UVa 10935 - Throwing cards away I
  9. Mac中显示和隐藏隐藏文件命令行
  10. 用视频作为Mac动态壁纸Dynamic Wallpaper
  11. nginx自签ssl证书
  12. 张俊芳电机学13章计算题以及答案
  13. PyMuPDF 拼版(一)
  14. PPT制作教程—基础技巧
  15. 在IE中为abbr标签加样式(转)
  16. 明清时期江右商的宗族教育——江西流坑村的历史人类学考察
  17. Single Round Match 506 Round 1 - Division I, Level Two SlimeXGrandSlimeAuto
  18. 咸鱼Micropython—SPI
  19. cd命令回到上级目录和回到根目录
  20. Python百度地图API,通过区县、村镇地址获取完整省市区行政区划

热门文章

  1. 数字化时代,安全沙箱技术促进企业网络安全生态安全运转
  2. 【GPU精粹与Shader编程】(八) 《GPU Pro 1》全书核心内容提炼总结
  3. Python构建投资模型(1)——从天天基金网爬数
  4. AI创业江湖里的师徒帮
  5. 阿里 P7 到底是怎样的水平?
  6. python字符串只保留字母_在字符串中只保留字母字符(多语言)
  7. VSCode 搭建 STM32 开发环境
  8. 记录springboot 启动时报错:no profiles are currently active
  9. win10如何禁止CDR软件访问网络的设置方法教程
  10. LE Coded PHY和LE Uncoded PHY