Django order by 高级用法
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 高级用法相关推荐
- oracle12c order by,oracle 数据库中order by 的一些高级用法
oracle数据库中order by用法 oracle数据库中order by的一些高级用法 现有一个表,表内容如下: 以下的操作都是对该表进行的操作 1.按照名称排序(默认为升序) 实现代码: se ...
- oracle 数据库中order by 的一些高级用法
oracle数据库中order by用法 oracle数据库中order by的一些高级用法 现有一个表,表内容如下: 以下的操作都是对该表进行的操作 1.按照名称排序(默认为升序) 实现代码: se ...
- Django基础(11): 表单集合Formset的高级用法详解
Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息.今天小编我就介绍下Djang ...
- django高级用法
使用Django意味着后台框架的几乎所有内容都会和Django产生互动,排除功能全部手撸的情况. Django 后台admin有大量的属性和方法,拥有强大的功能和自定义能力.通过完整的代码来看Djan ...
- Python 内置函数sorted()在高级用法
对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...
- sqlalchemy(二)高级用法
本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增加user_id这个外键(一对多). ...
- sql not exists用法_SQL Server 2012 高级用法(一)
最近用到了SQL Server 相关数据库等问题,于是整理了如下SQL Server高级用法系列. 该系列不再介绍基础用法(select ,insert, update, delete, and or ...
- 爬虫—Requests高级用法
Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requestsfiles = {' ...
- Qt QVector 详解:从底层原理到高级用法
目录标题 引言:QVector的重要性与简介 QVector的常用接口 QVector和std::Vector 迭代器:遍历QVector 中的元素(Iterators: Traversing Ele ...
- 《Python 深度学习》6.3 循环神经网络的高级用法 (代码)
# 6.3 循环神经网络的高级用法 本节将介绍提高循环神经网络的性能和泛化能力的三种高级技巧.学完本节,你将会掌握 用 Keras 实现循环网络的大部分内容.我们将在温度预测问题中介绍这三个概念.在这 ...
最新文章
- Android与iOS对比
- Vivado Logic Analyzer中VIO核的使用
- NotePad++列编辑
- 获取URL中 后面的参数值
- FICO蓝图设计-专题方案-财务组织架构
- 信号与槽是如何实现的_苹果iPhone 12信号仍弱?网友反馈打不进电话需重启解决...
- 爬了知乎 200 万数据,图说程序员都喜欢去哪儿工作
- UVa 10935 - Throwing cards away I
- Mac中显示和隐藏隐藏文件命令行
- 用视频作为Mac动态壁纸Dynamic Wallpaper
- nginx自签ssl证书
- 张俊芳电机学13章计算题以及答案
- PyMuPDF 拼版(一)
- PPT制作教程—基础技巧
- 在IE中为abbr标签加样式(转)
- 明清时期江右商的宗族教育——江西流坑村的历史人类学考察
- Single Round Match 506 Round 1 - Division I, Level Two SlimeXGrandSlimeAuto
- 咸鱼Micropython—SPI
- cd命令回到上级目录和回到根目录
- Python百度地图API,通过区县、村镇地址获取完整省市区行政区划