80.常用的返回QuerySet对象的方法使用详解:order_by
order_by: 将模型生成的表按照某个字段进行排序,默认情况下,按照升序的顺序排序,如果想要按照降序的顺序排序可以在字段的前面加一个“-”,加一个负号就可以进行反转。
models.py文件中示例代码如下:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
rating = models.FloatField(null=True)
class Meta:
db_table = 'category'
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True)
create_time = models.DateTimeField(auto_now_add=True, null=True)
def __str__(self):
return "<(Article: id: %s,title: %s, content: %s)>" % (self.id, self.title, self.content)
class Meta:
db_table = 'article'
mysql数据库表中article表和category表中的数据如下所示:


1.order_by: 传递一个字段名,对表中的数据进行排序,默认情况对所有的数据做升序的排序操作。示例代码如下:
from django.db.models import F, Q
from django.db improt connection
from .models import Article, Category
from django.http import HttpResponse
def index(request):
articles = Article.objects.order_by('create_time')
for article in articles:
print("%s, %s, %s" % (article.id, article.title, article.create_time))
print(connection.queries)
return HttpResponse("success!")
2. order_by: 传递一个字段名,对表中所有数据做降序操作,可以通过在字段名前面添加一个负号来解决。示例代码如下:
from django.db.models import F, Q
from django.db improt connection
from .models import Article, Category
from django.http import HttpResponse
def index(request):
articles = Article.objects.order_by('-create_time')
for article in articles:
print("%s, %s, %s" % (article.id, article.title, article.create_time))
print(connection.queries)
return HttpResponse("success!")
3. order_by:传递多个参数,首先按照category_id从小到大进行排序,之后按照create_time从大到小排序。示例代码如下:
from django.db.models import F, Q
from django.db improt connection
from .models import Article, Category
from django.http import HttpResponse
def index6(request):
# 将article表首先按category_id进行从小到大排序,之后在按create_time从大到小排序
articles = Article.objects.order_by('category', '-create_time')
for article in articles:
# 遍历每一个对象
print("%s, %s, %s" % (article.id, article.category, article.create_time))
# 查看原生sql语句
print(connection.queries)
return HttpResponse("success!")
注意:如果需要按照多个字段进行排序,不能使用多个order_by()语句链式调用实现,如果使用多个order_by语句,最后的排序结果是按最后一个order_by()语句传递的字段名进行排序的结果。
def index6(request):
# 将article表首先按category_id进行从小到大排序,之后在按create_time从大到小排序
# 不能使用链式的多个order_by()语句。这样的结果只会使用最后一个order_by语句的条件进行排序
articles = Article.objects.order_by('category').order_by('create_time')
for article in articles:
print("%s, %s, %s" % (article.id, article.title, article.create_time))
print(connection.queries)
return HttpResponse("success!")
4. 同样,在排序的时候可以在模型的定义的时候指定Meta类,给Meta类中的ordering属性传递一个列表,数据库表中的字段的顺序就是表中的字段排序的顺序
5.通过外键的关系映射出的关联表之间的排序。比如,首先将article表中的文章按创建的时间从大到小排序,之后按照文章的分类的评分从小到大进行排序。示例代码如下:
def index6(request):
# 关联表之间的排序
# 首先将article表中的文章按创建的时间从大到小排序,之后按照文章的分类的评分从小到大进行排序
articles = Article.objects.order_by('-create_time', 'category__rating')
for article in articles:
print("%s, %s, %s" % (article.id, article.category.rating, article.create_time))
print(connection.queries)
return HttpResponse("success")
查询结果为:
2, 3.4, 2020-02-05 03:04:59.860556+00:00
1, 3.6, 2020-02-05 03:04:59.860556+00:00
4, 3.6, 2020-02-05 03:04:59.860556+00:00
3, 4.8, 2020-02-05 03:03:30.860556+00:00
原生sql语句:SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article LEFT OUTER JOIN category ON (article.category_id = category.id) ORDER BY article.create_time DESC, category.rating ASC
6.将分类中图书的数量从多到少进行排序,示例代码如下:
from django.db import Count
def index6(request):
# 将分类按分类中的图书的数量从多到少进行排序
# 首先统计出每个分类中图书的数量,并且添加一个图书数量的字段
categories = Category.objects.annotate(article_nums=Count('article__category__id')).order_by('-article_nums')
for category in categories:
print("%s/%s/%s" % (category.id, category.name, category.article_nums))
print(categories.query)
return HttpResponse("success!")
打印出结果如下所示:
1/最新文章/2
2/最热文章/1
3/高评分文章/1
django底层执行的sql语句为: SELECT category.id, category.name, category.rating, COUNT(article.category_id) AS article_nums FROM category LEFT OUTER JOIN article ON (category.id = article.category_id) GROUP BY category.id ORDER BY article_nums DESC
80.常用的返回QuerySet对象的方法使用详解:order_by的更多相关文章
- 84.常用的返回QuerySet对象的方法使用详解:select_related, prefetch_related
1.select_related: 只能用在一对多或者是一对一的关联模型之间,不能用在多对多或者是多对一的关联模型间,比如可以提前获取文章的作者,但是不能通过作者获取作者的文章,或者是通过某篇文章获取 ...
- 82.常用的返回QuerySet对象的方法使用详解:all,select_related
1. all: 返回这个ORM模型的QuerySet对象. articles = Article.objects.all() print(articles) 2.select_related: 查找数 ...
- 85.常用的返回QuerySet对象的方法使用详解:defer,only
defer(),only(): 这两个方法都会返回一个"QuerySet"对象,并且这个"QuerySet"中装的是模型,不像values()和values_l ...
- 81.常用的返回QuerySet对象的方法使用详解:values和values_list
values: 指定提取的数据库表中的字段值,如果不指定任何的字段名的话,默认情况下会提取所有的字段值.但是需要注意的是使用values返回的QuerySet对象中包括的是一个个的字典. 1.提取与A ...
- 79.常用的返回QuerySet对象的方法使用详解: filter, exclude,annotate
返回新的QuerySet的常用方法: 1.filter: 将满足条件的数据提取出来,返回一个新的QuerySet 以下所使用的模型article,category,定义模型models.py文件中,示 ...
- asp.net中C#对象与方法 属性详解
C#对象与方法 一.相关概念: 1.对象:现实世界中的实体 2. 类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装 继承 多态 二.类的定义与语法 1.定义类: 修饰符 类名称 ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- js对象浅拷贝和深拷贝详解
js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...
- Underscore _.template 方法使用详解
为什么用「void 0」代替「undefined」 undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写. 事实上,undefined ...
随机推荐
- Day6 - C - Count HYSBZ - 1452 /1452: [JSOI2009]Count
Description 一个N*M的方格,初始时每个格子有一个整数权值,接下来每次有2个操作: 改变一个格子的权值 求一个子矩阵中某个特定权值出现的个数 Input 每一行有两个数字N,M 接下来 ...
- 08.swoole学习笔记--异步tcp客户端
<?php //创建异步tcp客户端 $client=new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC); //注册连接成功的回调函数 $c ...
- 【Jasypt】给你的配置加把锁
前言 前几天,有个前同事向我吐槽,他们公司有个大神把公司的项目代码全部上传到了 github,并且是公开项目,所有人都可以浏览.更加恐怖的是项目里面包含配置文件,数据库信息.redis 配置.各种公钥 ...
- DCGAN生成目标训练图片
前言: GAN的原理很简单,但是它有很多变体,如:DCGAN.CycleGAN.DeblurGAN等,它们也被用在不同地方,本文将用到DCGAN来生成头像图片,可以做到以假乱真的地步. 1.首先调用程 ...
- ArcGIS二次开发的几种方式
1.ArcEngine开发 二次开发的常用方式,开发提供接口齐全,功能强大,比较成熟.但是,开发的软件使用需要指定版本的运行环境才能运行. 2.Addin开发 二次开发与ArcMap嵌入,开发方便,可 ...
- LeetCode1217 玩筹码(贪心)
题目: 数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中. 你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): 将第 i 个筹码向左或者右移动 2 个单位,代价为 ...
- uni-app开发小程序-使用uni.switchTab跳转后页面不刷新的问题
uni.switchTab({ url: '/pages/discover/discover', success: function(e) { var page = getCurrentPages() ...
- HihoCoder第十四周:无间道之并查集
#1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息--额,说远了,总之,小Hi和小H ...
- 从PC厂商狠抓粉丝经济看,春天将至?
10月中旬,市场研究机构IDC发布的全球三季度PC出货量报告显示,第三季度全球个人电脑出货量总计6740万台,比去年同期下降0.9%.似乎这一数据的发布,依旧在证明着PC市场的颓势.但在这样的大背景下 ...
- js排序专场
1,冒泡排序 function bubble(arr) { var len = arr.length - 1; for (let i = 0 ; i < len; i++) { var bool ...