Django 06
注意
- 只要和数据库相关的功能, 基本在
django.db.models
里面
聚合查询
- 关键字: aggregate
- 用法 :
aggregate(变量名=聚合函数('字段名')
- 返回的是一个字典, 字典的键就是上面的变量名
# 1.求书籍的最高价格
res = models.Book.objects.aggregate(max=Max('price'))
print(res) # {'max': Decimal('118.88')}
# 2.求书籍总价格
res = models.Book.objects.aggregate(sum=Sum('price'))
print(res) # {'sum': Decimal('323.31')}
# 3.求书籍的平均价格
res = models.Book.objects.aggregate(avg=Avg('price'))
print(res) # {'avg': 107.77}
分组查询
- 通常和聚合函数搭配使用
- 关键字:
annotate(变量名=聚合函数()).values('变量名')
# 1.统计每一本书的作者个数(正向)
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title', 'author_num')
print(res)
# 2.每个出版社最便宜书的价格(反向)
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
print(res)
F与Q查询
- F() 方法可以直接拿到字段对应的值
# 先导入
from django.db.models import F, Q
# F()方法可以直接拿到某个字段对应的值
# 1.查询库存大于卖出的书籍
res = models.Book.objects.filter(stock_quantity__gt=F('sold_quantity')).values('title')
print(res)
# 2.将所有书的价格上涨10元
models.Book.objects.all().update(price=F('price') + 10)
# 3.将所有的书名后面加上 '新款', 字符串操作需要借助Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.all().update(title=Concat(F('title'), Value('新款')))
- filter()方法内多个条件用逗号隔开表示的and关系, 我们可以借助Q()方法来实现or和not关系
- or :
|
- not:
~
- Q() 的高级方法: 实例化对象, 利用对象来绑定查询条件, 支持字符串条件查询
# Q()的基本用法
# 1.查询书籍名称是三国演义或者库存大于500
res = models.Book.objects.filter(Q(title='三国演义') | Q(stock_quantity__gt=500))
print(res)
# 2.查询书籍名称不是三国演义的
res = models.Book.objects.filter(~Q(title='三国演义'))
print(res)
# Q()的高级用法
q = Q()
q.connector = 'or' # 默认是and
q.children.append(('title', '三国演义'))
q.children.append(('stock_quantity__gt', '500'))
res = models.Book.objects.filter(q)
print(res)
orm字段和参数
- 常用字段
字段类型 | 参数 | 描述 |
---|---|---|
AutoFiled |
primary_key=True 必填参数 |
用来主键字段 |
CharField |
max_length 必填参数 |
相当与MySQL中的varchar() |
IntegerField |
int32, 不能用来存手机号码, 位数不够, 可以用字符串存 | |
DataTimeField / DataField |
auto_now=True 每次更新数据记录时auto_now_add=True 创建数据记录时 |
年月日时分秒/年月日 |
BigIntegerField |
int64 | |
EmailField |
varchar(254) | |
DecimalField |
max_digits , decimal_places 必填参数 |
小数 |
BooleanField |
布尔值 | |
TextField |
大段文本 | |
FileField |
upload_to = " " 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage |
文件路径 |
- 通用参数
参数 | 效果 |
---|---|
null=True |
可以为空 |
unique=True |
字段必须是唯一的 (并设置索引) |
db_index=True |
设置索引 |
dufault |
设置默认值 |
自定义字段类型
查看django字段类型的源码, 发现都是一个个类, 并且都继承 Field
我们在
models.py
中创建自定义类, 继承 models.Field
# 自定义char类型字段
class MyCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
# 调用父类的__init__方法, 将参数按关键字参数传入
super().__init__(max_length=max_length, *args, **kwargs)
# 返回MySQL字段类型
def db_type(self, connection):
return f'char({self.max_length})' # char(max_length)
事务
- 事务是由sql语句组成的逻辑单元, 是一整体概念
ACID
- 原子性: 事务是最小执行单元, 不能再分了
- 一致性: 事务开始前和结束后数据库的数据整体上是一致的
- 隔离性: 多个事务之间有可以做到相互不影响
- 持久性: 事务的结果对数据库的影响是永久的
三大范式
- 每个字段都是不可再拆分的
- 要求表中要有主键,表中其他其他字段都依赖于主键,因此第二范式只要记住主键约束就好了
- 要求表中不能有其他表中存在的、存储相同信息的字段,通常实现是在通过外键去建立关联,因此第三范式只要记住外键约束就好了。
开启事务
from django.db.import transaction
with transaction.atomic():
# 在该缩进内书写数据库操作代码
# 缩进内的所有代码, 都属于一个事务
pass
Django 06的更多相关文章
- Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)
Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...
- day63 Pyhton 框架Django 06
内容回顾 1.装饰器 装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能. def wrapper(func): def inner(*args,**kwargs): # ...
- 06: Django Admin
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
- 06 Django REST Framework 版本控制
01-版本控制 对接口进行版本控制只是一种杀死已部署客户端的“礼貌”方式. - 罗伊菲尔丁. 1. API版本控制允许您更改不同客户端之间的行为.REST框架提供了许多不同的版本控制方案. 2. 版本 ...
- Django REST Framework API Guide 06
本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...
- 06 django的用户认证组件
1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...
- Django 2.0 学习(06):Django 视图(进阶)
概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...
- 06 - Django应用第三步
知识点 1) 编写urls 配合include()的URL查找过程 获取正则抓取的值并命名, 给url取名 2) 模板的编写 for循环的遍历 用点的方式执行函数, 不带括号 3) 视图函数的编写 H ...
随机推荐
- Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...
- Arduino 将 String 转化为 int
Arduino 将 String 转化为 int 函数:toInt() 实例: String my_str = "; int my_int = my_str.toInt();
- nyoj 1112-求次数 (string, substr(begin, length), map, pair)
1112-求次数 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:8 难度:2 题目描述: 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个新 ...
- Docker解决下载镜像速度慢
Docker安装好以后要用Docker pull命令下载镜像,但是会出现下载很慢的现象.Docker默认是国外的源,配置国内镜像仓库. 1.cd /etc/docker/路径下 2.编辑daemon. ...
- PHP字符逃逸导致的对象注入
1.漏洞产生原因: 序列化的字符串在经过过滤函数不正确的处理而导致对象注入,目前看到都是因为过滤函数放在了serialize函数之后,要是放在序列化之前应该就不会产生这个问题 ?php functio ...
- Json模块和Pickle模块的使用
在对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块.这两个模块主要区别如下: json 是一个文本序列化格 ...
- java 学习第三天小练习
今天做的是一些流程控制题,if...else,for循环等. 1.给定一个成绩,如果成绩大于80,则输出“奖励”.判断完后不管条件成不成立都要输出“继续努力”. package lianXiTi; i ...
- error: Unexpected console statement (no-console)
使用console.log 报错??这个错误是Vuejs - 使用ESLint检查代码而产生的 解决办法: 1.不处理,虽然有恼人的提示,但是实际上能使用console.log的 2.关掉ESLint ...
- 开始你的api:NetApiStarter
在此之前,写过一篇 给新手的WebAPI实践 ,获得了很多新人的认可,那时还是基于.net mvc,文档生成还是自己闹洞大开写出来的,经过这两年的时间,netcore的发展已经势不可挡,自己也在不断的 ...
- https揭秘
首先简要说明一下所谓的https证书是什么东西:打个比方,你第一次去银行办理业务的时候都需要手持本人身份中去办理业务,这个身份证从哪里来呢,没错,是从国家相关机关得来的,在中国内是通用的,类比到htt ...