聚合查询(aggregate)
# sum min max avg count
# 在orm中如何使用聚合函数
# 关键字:aggregate,我们需要在django中倒过来才能使用
from django.db.models import Count, Sum, Max, Min, Avg
# 求书籍表中得书的平均价格
# res = models.Book.objects.aggregate(Avg('price'))
# res = models.Book.objects.aggregate(Max('price'))
res = models.Book.objects.aggregate(Count('price'),Sum('price'),Max('price'),Min('price'),Avg('price'))
print(res)
分组查询(annotate)
# group by分组
# 分组之后只能取得分组的依据,其他的字段不能拿到
# 设置一个严格模式:sql_mode='only...'
# annotate
######################分组查询
from django.db.models import Count, Sum, Max, Min, Avg
# 1.统计每一本书的作者个数
# select *from book group by id
# res = models.Book.objects.annotate() # 就是安装书来分组的
# 正反向:书----》作者-----》正向-----》外键字段
# annotate就是对models后面的表进行分组
# 聚合函数一般都是配合分组使用的
# res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
# print(res)
# # 2.统计每个出版社卖的最便宜的书的价格
# 1. 按照出版社分组
# 2. 聚合查询书的价格
# 3. 出版社查书------------>反向查询------------》表名小写
# res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
# print(res)
# 3.统计不止一个作者的图书
# 1. 统计每一本的作者个数
# 2. 在过滤出作者个数大于1的就可以了
# 书----》作者-----》正向-----》外键字段
# res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title', 'author_num')
# res只要返回的结果是queryset,就可以一直往下点 queryset提供的方法
# res = models.Book.objects.annotate(Count('authors'))
# print(res)
# 4.查询每个作者出的书的总价格
# 1. 按照作者分组
# 2. 作者查书
# 总价格
# res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name', 'sum_price')
# print(res)
F与Q查询
# 1.查询卖出数大于库存数的书籍
####################F查询
from django.db.models import F
# 1.查询卖出数大于库存数的书籍
# select * from book where sale_num > kucun;
# kucun
# res = models.Book.objects.filter(sale_num__gt=F('kucun'))
# print(res)
# # 2.将所有书籍的价格提升500块
# update app01_book set price = price+500;
# res = models.Book.objects.update(price=F('price')+500)
# 3.将所有书的名称后面加上爆款两个字
# update app01_book set title = title + 'haha' ;
from django.db.models.functions import Concat
from django.db.models import Value
# models.Book.objects.update(title=F('title')+'haha') # 不能这样写
models.Book.objects.update(title=Concat(F('title'), Value('haha')))
Q查询
# # 1.查询卖出数大于100或者价格小于600的书籍
# select * from book where sale_num > 100 or price < 600;
# res = models.Book.objects.filter(sale_num__gt=100, price__lt=600) # and关系
# res = models.Book.objects.filter(sale_num__gt=100).filter(price__lt=600) # and关系
from django.db.models import Q
# res = models.Book.objects.filter(sale_num__gt=100).filter(price__lt=600) # and关系
# res = models.Book.objects.filter(Q(sale_num__gt=100), Q(price__lt=600)) # and关系
# res = models.Book.objects.filter(Q(sale_num__gt=100)|Q(price__lt=600)) # or关系
# res = models.Book.objects.filter(~Q(sale_num__gt=100)|Q(price__lt=600)) # ~是非的关系
# print(res)
# Q补充高级用法
res = models.Book.objects.filter(Q(sale_num__gt=100) | Q(price__lt=600))
''''''
# 'price'
# requests.GET.get('sort') # price
# res = models.Book.objects.filter(price__gt=100)
# # res = models.Book.objects.filter('price'+'__gt'=100)
q = Q()
q.connector = 'or' # 把多个查询条件改为OR关系了
q.children.append(('maichu__gt', 100))
q.children.append(('sale_num__lt',100))
res = models.Book.objects.filter(q) # and关系 ,,
print(res)
# 想学习Q的更高级用法,自行百度
django中如何开启事务
# mysql中的事务
ACID
...
# MySQL的隔离级别:脏读,重复读
开启事务的步骤
1、 开启事务
start transaction;
2、提交事务
commit;
3、回滚事务
rollback;
# django中如何开启事务
from django.db import transaction
try:
with transaction.atomic():
models.Book.objects.create()
models.Publish.objects.update()
# sql1
# sql2
...
except Exception as e:
print(e) # 当sql语句出现异常的时候,可以在这里打印错误信息
transaction.rollback()
模型层中得常见字段和参数
# AutoField
int自增列,必须填入参数 primary_key=True。
# IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。
# CharField
# DateField
# DateTimeField
auto_now=True
auto_now_add=True
# BooleanField(Field)
- 布尔值类型
# 在代码里面就是要True/False-------------->在数据库中存的是0/1
# TextField(Field)
- 文本类型------------>可以存大段的文本------------->当字符串比较少的时候,一般用varchar(512)
----------》text----->存一篇文章
# FileField(Field) ------------> 可以上传文件
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
# image = models.FileField(upload_to='文件上传的位置')
image = models.ImageField(upload_to='图片') # 只能上传图片
# FloatField(Field)
- 浮点型
# DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
ORM字段参数
#### null
用于表示某个字段可以为空。
# max_length
# verbose_name
# default----->指定默认值
# unique=True
# db_index=True 加索引
自定义字段
class FixedCharField(models.Field):
"""
自定义的char类型的字段类
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
def db_type(self, connection):
"""
限定生成数据库表的字段类型为char,长度为max_length指定的值
"""
return 'char(%s)' % self.max_length
class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用自定义的char类型的字段
cname = FixedCharField(max_length=25)