Django框架-11

聚合查询

1.聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最
小,Sum 求和,被定义在django.db.models中。
例:查询图书的总阅读量。

from modelsdemo.models import *
from django.db.models import *BookInfo.objects.aggregate(Sum('bread'))

注意aggregate的返回值是一个字典类型,格式如下:

{'属性名__聚合类小写':}:{'bread__sum':156}

使用count时一般不使用aggregate()过滤器。
例:查询图书总数。

BookInfo.objects.count()

注意count函数的返回值是一个数字。

2. 排序

使用order_by对结果进行排序

BookInfo.objects.all().order_by('bread') # 升序
BookInfo.objects.all().order_by('-bread') # 降序

关联查询

(BookInfo类)tb_books (表) 一 的一方
(HeroInfo类)tb_heros(表) 多的一方

1 关联查询

由一到多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set 例:

b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()

由多到一的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名
例:

h = HeroInfo.objects.get(id=1)
h.hbook

访问一对应的模型类关联对象的id语法:
多对应的模型类对象.关联类属性_id
例:

h = HeroInfo.objects.get(id=1)
h.hbook_id

2 关联过滤查询

由多模型类条件查询一模型类数据:
语法如下:

关联模型类名小写__属性名__条件运算符=

注意:如果没有"__运算符"部分,表示等于。
例:
查询图书,要求图书英雄为"孙悟空"

BookInfo.objects.filter(heroinfo__hname='孙悟空')

查询图书,要求图书中英雄的描述包含"八"

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

由一模型类条件查询多模型类数据:
语法如下:

一模型类关联属性名__一模型类属性名__条件运算符=

注意:如果没有"__运算符"部分,表示等于。
例:
查询书名为“天龙八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle__exact='天龙八部')

查询图书阅读量大于30的所有英雄

HeroInfo.objects.filter(hbook__bread__gt=30)

查询集 QuerySet

1 概念

Django的ORM中存在查询集的概念。
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。

当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据。
order_by():对结果进行排序。

对查询集可以再次调用过滤器进行过滤,如

BookInfo.objects.filter(bread__gt=30).order_by('bpub_date')

也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果。
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

2 两大特性

1)惰性执行

创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用

例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集qs

qs = BookInfo.objects.all()

继续执行遍历迭代操作后,才真正的进行了数据库的查询

for book in qs:print(book.btitle)

访问一个网站:
保存到本地

2)缓存

使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。

情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。

from booktest.models import BookInfo
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]

情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据。

qs=BookInfo.objects.all()
[book.id for book in qs]
[book.id for book in qs]

3 限制查询集

可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。

注意:不支持负数索引。

对查询集进行切片后返回一个新的查询集,不会立即执行查询。

如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。

示例:获取第1、2项,运行查看。

qs = BookInfo.objects.all()[0:2]

执行原生SQL语句

管理器介绍
管理器是Django的模型进行数据库操作的接口,Django应用的一个模型类都拥有至少一个管理器。

我们在通过模型类的objects属性提供的方法操作数据库时,即是在使用一个管理器对象objects。当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,它是
models.Manager类的对象。

1)使用管理器执行原生SQL语句
Manager.raw(raw_query, params=None, translations=None)
2)使用 connection.cursor()执行原生SQL
在这里插入图片描述
视图views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import *
from django.db import connection
# Create your views here.
def index(request):
"""模型与数据库测试"""
# 1.使用管理器执行原生sql
# qs = BookInfo.objects.raw("select * from tb_books")
# for item in qs:
# print(item)
# print(item.__dict__)
# 2.使用连接游标执行原生sql mysql ---> python
with connection.cursor() as cur:
cur.execute('select * from tb_books')
row = cur.fetchone()
#rows = cur.fetchall()
print(row)
return HttpResponse(str(row))

路由urls.py

from django.urls import path
from . import views
# 根路由的配置
urlpatterns = [
path('index/', views.index),
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/17529.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端全集Ⅰ---- HTML/CSS/JavaScript

一 介绍web开发 Web:全球广域网,也称万维网,能够通过浏览器访问的网站 Web网站的工作流程:(前后端分离模式) 网页有哪些组成? 文字、图片、视频、音频、超链接 前端代码通过浏览器的解析和渲…

导入Excel数据【EasyPoi实战系列】- 第480篇

历史文章(文章累计480) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 【…

docker 安装zookeeper单机版

1. 安装版本3.5.7, 也可以自己去官网找到自己需要的版本复制命令即可 https://hub.docker.com/_/zookeeper/tags docker pull zookeeper:3.5.7 2. 创建映射文件夹: #1. 在centos中创建三个文件夹 mkdir -p /home/zookeeper/conf mkdir -p /home/zookeeper/data mkd…

Redis事务

reids事务是指将多条命令放在一个队列当中,保证多个命令在同一个事务中执行而不受其他客户端的影响。 mutil 表示开启事务 命令1 命令2 命令3 exec 表示执行事务 redis的事务中不会保证原子性,假如命令3有误,并不会影响命令1和命令2的执行…

Linux信号机制-2

转自:Linux信号处理_linux 信号处理函数_努力啃C语言的小李的博客-CSDN博客 什么是信号 信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源: 程序错误:除零,非法内存访问等。 外部信号&#xff1a…

Mybatis从0到1 SQL注入 参数占位符 XML配置 动态SQL

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能…

我爱学QT-仿写智能家居界面 上 中 下

学习链接: 仿写一个智能家居界面(上)_哔哩哔哩_bilibili 上 给QT工程添加资源文件 在这里 然后选这个,choose后会有起名,之一千万不能是中文,要不就等报错吧 然后把你要添加的图片托到文件夹下&#xf…

TortoiseGit 入门指南01:环境搭建和软件设置

在我的博文Keil MDK环境下Git入门指南的最后,我这样写道: 目前使用 TortoiseGit 管理工程,用 Gitee 作为远程仓库。 命令行 Git 已经不再使用。 当时我并没有介绍软件 TortoiseGit 的使用方法,这个系列补上。如果你还没有看过《Ke…

希尔排序及其时间复杂度(图文详解)

😾 博客主页: 爱吃bug的猿 🚀博客专栏: 数据结构,C语言初阶进阶全流程讲解 😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新 文章目录 前言1. 代码思路代码实现法1代码实现法2(不…

HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题

导航: 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式常见面试题源码_vincewm的博客-CSDN博客 目录 一、底层 1.1 HashMap数据结构 1.2 扩容机制 1.3 put()流程 1.4 HashMap是如何计算…

【Python爬虫与数据分析】Jupyter的安装与快捷键

目录 一、jupyter notebook安装与配置 二、命令模式快捷键 三、编辑模式快捷键 四、文件操作 一、jupyter notebook安装与配置 安装:Jupyter Notebook是以网页的形式打开的一个程序,集成在Anaconda包里面,也可以直接安装python3解释器&a…

docker安装es集群(三台)

文章目录 1、防火墙设置,开启所需端口2、创建目录,并更改目录权限3 设置系统参数4 启动5 安装ik分词器6 配置7 安装elasticsearch-head(用于访问es,界面化工具)8、 修改es中每次返回的数据数量参数(默认100…