Django基础之模型层(下)
聚合查询
关键字:aggregate
from django.db.models import Max,Min,Sum,Count,Avg
统计所有书的平均价格
models.Book.objects.all().aggregate(Avg('price')) #拿所有的书籍的价格的平均值
这样的话就可以求最大的价格,最小的价格等
分组查询
关键字:annotate
统计每一本书的作者个数
models.Book.objects.annotate(author_num = Count('author')).values('title')
统计每一个出版社卖的最便宜的书的价格
models.Book.objects.annotate(price_min=Min('book__price')).values('price_min')
统计不止一个作者的图书
models.Book.objects.annotate(author_num = Count('author')).values('author_num').filter(author__num__gt=1)
查询各个作者出的书的总价格
models.Author.objects.annotate(sum_price = Sum('book__price')).values('sum_price')
F与Q查询
F查询
查询卖出数大于库存数
models.Book.objects.filter(maichu__gt=F('kucun'))
将所有的书的价格全部提高100元
models.Book.objects.update(price=F('price')+ 100)
将所有书的名字后面都加上爆款
from django.db.models.functions import Concat
from django.db.models import Value
ret3=models.Product.objects.update(name=Concat(F('name'),Value('爆款')))
Q查询
查询书籍名称是python入门或者价格是54的书
models.Book.objects.filter(Q(title='python入门')|Q(price=54))
查询书籍名称不是python入门或者价格是54的书
models.Book.objects.filter(~Q(title='python入门')|Q(price=54))
Q查询进阶
查询条件由用户输入决定
q = Q()
q.connector = 'or' #将默认and,改为or
q.children.append(('title','python'))
q.children.append(('kucun',666))
res = models.Book.objects.filter(q)
字符串左边跟变量名书写的格式一模一样
ORM中常见字段
ORM字段与MySQL字段对应关系
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
自定义char字段
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self, connection):
return 'char(%s)'%self.max_length
查询优化(面试)
only与defer
only会将口号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库
一旦你点了不在括号内的字段 就会频繁的去走数据库查询
defer和only互为反关系,defer会将括号内的字段排除之外,将其他字段对应的值 直接封装到返回给你的对象中,点该其他字段 不需要再走数据库,一旦你点了在括号内的字段 就会频繁的去走数据库查询

select_related与prefetch_related
select_related会自动帮你做连表操作,然后连表之后的数据全部查询出来封装给对象
select_related括号内只能放外键字段,并且多对多字段除外
如果括号内所关联的外键字段还有外键字段,还可以继续连表
select_related(外键字段__外键字段__外键字段...)
prefetch_relate看似是连表操作,其实是子查询,内部不做连表,小号的资源就在查询次数上,但是给用户感觉不出来

Django ORM中的事务操作
ACID:原子性、一致性、隔离性、持久性
from django.db import transaction
with transaction.atomic():
#在该代码块中所写的orm语句 同属于一个事务
#缩进出来之后自动结束
补充知识:
django2.x版本:在建数据库关系的时候需要手动指定2个参数,要告诉django级联更新,级联删除,是否建立外键约束
on_delete,db_constraint
图片转自:https://www.cnblogs.com/Dominic-Ji/
Django基础之模型层(下)的更多相关文章
- Django基础之模型层(02)
1 重要概念 # 多表查询 """ 正向查询 反向查询 当前查询对象是否含有外键字段 如果有就是正向 没有无则是反向 口诀: 正向查询按外键字段 多对多需要额外再加一个. ...
- Django基础(3)----模型层-单表操作,多表创建
昨日内容回顾: 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} { ...
- Django基础之模型层(01)
内容概要 查询关键字 MySQL select from where group by having order by distinct limit r ...
- Django基础之模型(models)层(上)
目录 Django基础之模型(models)层 单表查询 必知必会13条 神奇的双下划线查询 多表查询 外键的字段的增删改查 表与表之间的关联查询 基于双下划线的跨表查询(连表查询) 补充知识 Dja ...
- Django的日常-模型层(1)
目录 Django的日常-模型层(1) 模型层 django测试环境 ORM查询 Django的日常-模型层(1) 模型层 模型层其实就是我们应用名下的models.py文件,我们在里面写入想要创建的 ...
- Django的日常-模型层(2)
目录 Django的日常-模型层(2) 几种常用的查询方式 聚合查询 分组查询 F和Q查询 查询优化相关 orm中常见字段 choices参数 orm的事务操作 Django的日常-模型层(2) 几种 ...
- Django学习之模型层
模型层 查看orm内部sql语句的方法的方法 1.如果是queryset对象,那么可以点query直接查看该queryset的内部sql语句 2.在Django项目的配置文件中,配置一下参数即可实现所 ...
- Django - 模型层 - 下
一.多表 sql 单表 多表 多对一 多对多 一对一 =============================================== 一对多:Book id title price p ...
- Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
随机推荐
- 20175215 2018-2019-2 第十周java课程学习总结
第十二章 Java多线程机制 12.1 进程与线程 12.1.1 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本. 进程是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个 ...
- python3笔记二十:时间操作time
一:学习内容 time时间戳 time元组 time字符串 time时间转换图解 二:time 需要引入:import time 1.概念 UTC(世界协调时间):格林尼治天文时间,世界标准时间,在中 ...
- 5 Java 插入排序
1.基本思想 将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小则依次交换,直到出现比选择元素小的元素或者全部元素都比较过为止. 2.算法描述 ①. 从第一个元素开始,该 ...
- Fastadmin 后台表单,外键关键,步骤
1.在 public\assets\js\backend 目录中找到对应的js,修改 2.对应控制器中加上index()方法:开启关联查询 重点: protected $relationSearch ...
- 模拟LinkedList
Linkedlist是一个集合容器,具有增删改查基本功能,本例中模拟增删查,对于修改,只需要将原节点处的val更新为新值即可,增加和删除在链表中速度是比较快的,查找,修改慢,因为要从头或者从尾开始遍历 ...
- php执行方式对比:mod_php&php-fpm
mod_php 1.是apache的附属包,apache死掉后php也会死掉 2.稳定性差,php出错服务器进程也会受影响 php-fpm 1.和nginx是两个独立的个体. 2.php- ...
- fmri格式相关简介————转自网络
转自莫毕业 目前,脑成像数据主要有DTI.fmri.3D三种模态.这些数据在分析前都要进行格式转换,不同公司的扫描仪存储格式也不尽相同.脑成像处理软件也很多,不同软件使用的格式也不一样,所以数据转换是 ...
- Oracle 12C 物理Standby 主备切换switchover
Oracle 12C 物理Standby 主备切换switchover Oracle 12C 物理Standby 主备切换switchover Table of Contents 1. 简述 2. 切 ...
- Jsp中的四个域对象
四个域对象: pageContext page域 request request域 session session域 application ...
- Appium移动自动化测试(五)之应用操作
实验简介 对于APP测试来讲, 除了进行功能测试以外, 安装和卸载其实也是一个很重要的测试项. 试想, 如果用脚本来实现了, 可以事先判断该应用是否已安装, 根据判断结果来执行安装和卸载的动作, 循环 ...