79.常用的返回QuerySet对象的方法使用详解: filter, exclude,annotate
返回新的QuerySet的常用方法:
1.filter: 将满足条件的数据提取出来,返回一个新的QuerySet
以下所使用的模型article,category,定义模型models.py文件中,示例代码为:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
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'
(1). 在使用QuerySet进行查找的时候,可以执行多种操作比如filter()方法进行id的过滤完成后,还要根据某个字段进行排序,那么这一系列的操作我们可以通过一个非常专业的操作叫做“链式调用”的方式进行。比如,要从文章列表中获取id大于等于2的,并且提取之后将结果根据发布的时间进行排序(order_by()),示例代码如下:
首先查看数据库表中数据的信息:
from django.http import HttpResponse
from .models import Article
from django.db.models.manager import Manager
from django.db.models.query import QuerySet
def index4(request):
articles = Article.objects.filter(id__gte=2).order_by("create_time")
for article in articles:
print("%s, %s, %s" % (article.title, article.content, article.create_time))
print(articles.query)
return HttpResponse("success !")
打印出结果如下:
3, 钢铁是怎样炼成的, 你好, 2020-02-05 03:03:30.860556+00:00
2, Hello World, 大家好, 2020-02-05 03:04:59.860556+00:00
4, 中国吸引力, 精彩极了, 2020-02-05 03:04:59.860556+00:00
由输出的结果,我们可以看出文章已经按时间的顺序进行排序了,默认情况下是按照降序的顺序。
打印出django底层所执行的原生SQL语句:
SELECT article
.id
, article
.title
, article
.content
, article
.category_id
, article
.create_time
FROM article
WHERE article
.id
>= 2 ORDER BY article
.create_time
ASC。
可以看出我们的查询条件已经被翻译成了WHERE article
.id
>= 2 ORDER BY article
.create_time
ASC
(2). 如果想要将id大于等于3,但是不等于4的文章查找出来,就可以使用Q表达式和~来实现。注意:一定不要用"xxx != xxx"来实现,因为这样在python中会返回bool型的True或者是False。示例代码如下:
from django.db.models import Q
from django.http import HttpResponse
from .models import Article, Category
from django.db.models.query import QuerySet
from django.db.models.manager import Manager
def index5(request):
articles = Article.objects.filter(id__gte=3).filter(~Q(id=4))
# articles = Article.objects.filter(id__gte=3).exclude(id=4)
for article in articles:
print("%s, %s, %s" % (article.id, article.title, article.create_time))
print(articles.query)
return HttpResponse('success!')
打印出执行的结果:
3, 钢铁是怎样炼成的, 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
WHERE (article
.id
>= 3 AND NOT (article
.id
= 4))
2. exclude:排除满足条件的数据,返回一个新的QuerySet。示例代码如下:
def index5(request):
articles = Article.objects.exclude(title__icontains='hello')
for article in articles:
print("%s, %s, %s" % (article.id, article.title, article.create_time))
print(articles.query)
return HttpResponse('success!')
打印出结果如下所示:
3, 钢铁是怎样炼成的, 2020-02-05 03:03:30.860556+00:00
4, 中国吸引力, 2020-02-05 03:04:59.860556+00:00
django底层执行的sql语句:SELECT article
.id
, article
.title
, article
.content
, article
.category_id
, article
.create_time
FROM article
WHERE NOT (article
.title
LIKE %hello%)
3. annotate:给QuerySet中的每个对象都添加一个使用查询表达式(聚合函数,F表达式,Q表达式,Func表达式等)的字段,示例代码如下:
def index5(request):
articles = Article.objects.annotate(category_name=F("category__name"))
for article in articles:
print("%s, %s, %s" % (article.id, article.title, article.category_name))
print(articles.query)
return HttpResponse('success!')
打印出返回的结果如下:
1, Hello, 最新文章
2, Hello World, 最热文章
3, 钢铁是怎样炼成的, 高评分文章
4, 中国吸引力, 高评分文章
SELECT article
.id
, article
.title
, article
.content
, article
.category_id
, article
.create_time
, category
.name
AS category_name
FROM article
LEFT OUTER JOIN category
ON (article
.category_id
= category
.id
)
79.常用的返回QuerySet对象的方法使用详解: filter, exclude,annotate的更多相关文章
- 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 ...
- 84.常用的返回QuerySet对象的方法使用详解:select_related, prefetch_related
1.select_related: 只能用在一对多或者是一对一的关联模型之间,不能用在多对多或者是多对一的关联模型间,比如可以提前获取文章的作者,但是不能通过作者获取作者的文章,或者是通过某篇文章获取 ...
- 81.常用的返回QuerySet对象的方法使用详解:values和values_list
values: 指定提取的数据库表中的字段值,如果不指定任何的字段名的话,默认情况下会提取所有的字段值.但是需要注意的是使用values返回的QuerySet对象中包括的是一个个的字典. 1.提取与A ...
- 80.常用的返回QuerySet对象的方法使用详解:order_by
order_by: 将模型生成的表按照某个字段进行排序,默认情况下,按照升序的顺序排序,如果想要按照降序的顺序排序可以在字段的前面加一个"-",加一个负号就可以进行反转. mode ...
- asp.net中C#对象与方法 属性详解
C#对象与方法 一.相关概念: 1.对象:现实世界中的实体 2. 类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装 继承 多态 二.类的定义与语法 1.定义类: 修饰符 类名称 ...
- js对象浅拷贝和深拷贝详解
js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- Underscore _.template 方法使用详解
为什么用「void 0」代替「undefined」 undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写. 事实上,undefined ...
随机推荐
- html的适配
html值得一说的应该就是适配 !!适配是与手机同时存在的 写好一个页面在手机端打开,会发现这个页面显示很小,那是因为设备的视口宽度viewport不等于设备宽度device-width,而页面是根据 ...
- 062、Java中的方法重载
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with specified [javax.transaction.TransactionManager] required
错误信息: java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA trans ...
- 使用linux将一个服务器上的文件或者文件夹复制黏贴到另一个服务器上
一.复制文件: (1)将本地文件拷贝到远程 scp 文件名 用户名@计算机IP或者计算机名称:远程路径 本地192.168.1.8客户端 scp /root/install.* root@10.12 ...
- pyhton中pandas数据分析模块快速入门(非常容易懂)
//2019.07.16python中pandas模块应用1.pandas是python进行数据分析的数据分析库,它提供了对于大量数据进行分析的函数库和各种方法,它的官网是http://pandas. ...
- Windows安装tensorflow,配置vs2013,anaconda3.4,cudn9.0,cudnn7.0和pycharm
前言 最近要开始学习深度,那么首先在电脑上安装tensorflow.但是我不知道是配置版本的问题,还是安装失误的问题,我安装了很久没有安装成功,最后重装了电脑,并且融合了所有的网上可以查到的方案才安装 ...
- L2d插件
<script src="https://blog-static.cnblogs.com/files/yyhh/L2Dwidget.min.js"></scrip ...
- Day 23:JAVA SE复习
作业 1.多线程下载图片 import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream ...
- GeneWise
GeneWise是用于将蛋白质序列进行同源预测的软件
- 印度第一颗CPU横空出世!阵势庞大
我们忙着推进国产芯片的同时,隔壁的印度也没闲着.作为印度顶级高校的印度理工学院(IIT)之马德拉斯校区已经发布了其首颗处理器“Shakti”(代表女性力量的印度神话人物)的SDK软件开发包,并承诺会很 ...