(day54)六、事务、分组、F、Q、常用字段、事务
目录
一、聚合查询aggregate
- 利用聚合函数(Avg, Sum, Max, Min, Count)查询,返回一个字典
- 默认字典的键的名称是
字段__聚合函数名
,也可以自定义
from django.db.models import Max,Min,Sum,Avg,Count
# 1.筛选出价格最高的书籍的
res = models.Book.objects.aggregate(mr = Max('price'))
print(res)
# 2.求书籍总价格
res = models.Book.objects.aggregate(sm = Sum('price'))
print(res)
# 3.求书籍平均价格
res = models.Book.objects.aggregate(av = Avg('price'))
print(res)
# 4.一起使用
res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
print(res)
二、分组查询annotate
- 一般和聚合查询联用,相当于sql语句中的group by
- annotate前面是分组的依据,括号内的是聚合函数
- values中的参数是要查询的字段
- filter的参数相当于where或者having
from django.db.models import Max,Min,Sum,Avg,Count
# 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)
# 按照其他字段分组
res = models.Publish.objects.values('想要分组的字段名').annotate(min_price=Min('book__price')).values('name','min_price')
print(res)
# 3.统计不止一个作者的图书
# 1.先拿书及对应的作者数
# 2.再筛选出大于一的图书 书名 作者数目
res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)
# 4.查询各个作者出的书的总价格 作者名字 总价格
res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
print(res)
三、F与Q查询
(一)F查询
F可以指代对象自己,通过
F('字段名')
来取出对象自己的字段值来进行比较如果修改char字段只能使用Concat, 参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值
```python
from django.db.models import F,Q
1. 查询库存数大于卖出数的书籍
res = models.Book.objects.filter(kun_cun__gt = F('mai_cun')).values('title') # 后面的条件是来自于数据库的其他字段值
2. 将所有书的价格上涨100块
models.Book.objects.all().update(price=F('price') + 100)
3.将所有书的名称后面全部加上 "爆款" 后缀(操作字符串数据需要借助于Concat方法)
from django.db.models.functions import Concat
from django.db.models import Value
ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
```
(二)Q查询
(1)正常查询
- 可以提供逻辑语句(OR,NOT,AND)
- AND:符号
&
,默认为AND - OR:符号
|
- NOT:符号
~
from django.db.models import Q
# 1.查询一下书籍名称是三国演义 或者 库存数是500的书籍
res = models.Book.objects.filter(title='三国演义',kun_cun=500) # and关系
res = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500)) # Q包裹之后逗号还是and关系
res = models.Book.objects.filter(Q(title='三国演义') | Q(kun_cun=500)) # |就是or的关系
res = models.Book.objects.filter(~Q(title='三国演义') | Q(kun_cun=500)) # ~就是not关系
(2)按照字符串查询
- connector:默认是and关系,可以修改成or
- .children.append:查询条件追加,列表类型
from django.db.models import Q
q = Q()
q.connector = 'or' # 默认是and 可以改成or
q.children.append(('title','三国演义'))
q.children.append(('kun_cun__gt',500))
res = models.Book.objects.filter(~q) # 取反
四、ORM字段及参数
(一)常用字段
CharField :MySQL中的varchar类型,必须提供max_length参数, max_length表示字符长度。
IntegerField:MySQL中的int类型
BigIntegerField:MySQL中的bigint类型
EmailField:MySQL中的varchar(254)类型
DateField:日期字段,相当于 Python中的datetime.date()
DateTimeField: 日期时间字段,相当于Python中的datetime.datetime()
参数
auto_now:每次修改数据的时候 都会自动将当前修改时间更新上去 实时更新
auto_now_add:在创建数据的时候 会将当前时间自动记录,之后不会自动修改 除非人为修改
AutoField: int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列
BooleanField:布尔值,该字段在存储的时候 你只需要传布尔值True或False,它会自动存成1/0
TextField:专门用来存大段文本
FileField:专门用来存储文件路径
upload_to = '路径',给该字段传值的时候 直接传文件对象,会自动将文件对象保存到upload_to后面指定的文件路径中,然后将路径保存到数据库
DecimalField(Field):10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
- 参数:
(二)通用参数
(1)null
用于表示某个字段可以为空。
(2)unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
(3)db_index
如果db_index=True 则代表着为此字段设置索引。
(4)default
为该字段设置默认值。
(三)自定义char字段
from django.db import models
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): # 向MySQL交互返回char(长度)
return 'char(%s)'%self.max_length
五、ORM中的事务操作
事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性
from django.db import transaction
with transaction.atomic():
# 在缩进的代码中书写数据库操作
# 该缩进内的所有代码 都是一个事务
pass
最新文章
- MySQL数据类型和常用字段属性总结
- dispatch_sync may result in dead-lock
- sql导入默认用户解决杰奇cms无法登陆管理员账户问题
- 背景图片background-size兼容ie8以下浏览器解决
- Docker基础技术:Linux Namespace(上)
- 升级yosemite后java出错的解决
- java中synchronized使用方法
- MarkDown 格式生产类型
- 它们的定义iOS双击Home截图按键开关
- DWR入门的例子(一个)
- STL -->; map容器
- vscode中添加git
- redis 缓存击穿 看一篇成高手系列3
- @RequestParam加不加的区别
- 我们一起学习WCF 第六篇文件传输
- Hexo重装小结
- 【原创】锐捷实现OSPF路由协议和NAT地址转换协议
- c# 数据写入三菱PLC
- 2017北京国庆刷题Day5 morning
- Zabbix-3.0.0 安装Graphtree
热门文章
- Node.js接口避免重复启动
- 8. java 面向对象
- Java 的synchronized关键字使用
- Hbase启动出问题 master.HMaster: Failed to become active master
- Linux中vim和vi编辑器的使用
- js 的cookie问题
- Leetcode练习题 Palindrome Number
- Mybatis技术内幕(一)——整体架构概览
- tensorflow slim代码使用
- windows7_删除”右键-新建“菜单中的多余项