目录
1.扩展
2.Djago admin使用
3.Django 测试环境
4.Django查看原生sql
5.Django 聚合查询
6.Django F查询
7.Django Q查询
8.Django 分组查询
1.扩展
1. 普通函数以__开头
-说明当前函数只在当前模块(py)下使用,尽量不在外部调用
2. mysql
-utf8:2个字节表示一个字符
-utf8mb4:等同于真正意义上的utf-8
-utf-8:1--4个字节,表示一个字符
3. django 的orm使用pymysql连接mysql
-需要加这一句话(本质就是猴子补丁的应用)
import pymysql
pymysql.install_as_MySQLdb()
-本质是想让它执行,放在哪都可以
-init中
-settings.py中
2.Djago admin使用
1. 后台管理,方便我们快速的录入书籍
2. 使用方法:
第一步:在admin.py 中把要使用的表注册
from app01 import models
admin.site.register(models.Book)
admin.site.register(models.Publish)
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)
第二步:创建个超级管理员
python3 manage.py createsuperuser
输入用户名,输入密码
第三步:登录
http://127.0.0.1:8000/admin/
3.Django 测试环境
# tests.py
import os
#加载配置文件,跑django的项目,最开始就是把配置文件加载上
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "skyy.settings")
if __name__ == '__main__':
import django # 安装了django模块,就可以import
django.setup() # 使用环境变量中的配置文件,跑django
from app01 import models
4.Django查看原生sql
1. queryset对象.query
2. 通过日志,如下,配置到setting.py中
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
5.Django 聚合查询
# tests.py
from django.db.models import Sum,Avg,Max,Min,Count
# 计算所有图书的平均价格
Countres=models.Book.objects.all().aggregate(Avg('price'))
print(res)
# 计算所有图书的最高价格
res=models.Book.objects.all().aggregate(Max('price'))
print(res)
# 计算所有图书的总价格
res=models.Book.objects.all().aggregate(Sum('price'))
print(res)
# 计算所有图书的总价格
res=models.Book.objects.all().aggregate(book_sum=Sum('price'),book_avg=Avg('price'))
print(res)
# 测试出版图书的总价格
res = models.Book.objects.filter(authors__name='测试').values('publish__book').aggregate(Sum('price'))
print(res)
# 北京出版社书的最高价格
res1 = models.Publish.objects.filter(name='北京出版社').values('book').aggregate(Max('book__price'))
print(res1)
6.Django F查询
# tests.py
# F 查询,取出某个字段对应的值
from django.db.models import F
#查询评论数大于阅读数的书籍
res=models.Book.objects.filter(commit_num__gt=F('read_num'))
print(res)
# 把所有图书价格+1
res=models.Book.objects.all().update(price=F('price')+1)
print(res) # 影响额行数
7.Django Q查询
# Q查询:构造出与& 或| ^非~
from django.db.models import Q
# 查询名字叫红楼梦或者价格大于100的书
res=models.Book.objects.filter(name='红楼梦',price__gt=100)
res=models.Book.objects.filter(Q(name='红楼梦')|Q(price__gt=100))
res=models.Book.objects.filter(Q(name='红楼梦')& Q(price__gt=100))
# 查询名字不是红楼梦的书
res=models.Book.objects.filter(~Q(name='红楼梦'))
#查询名字不是红楼梦,并且价格大于100的书
res = models.Book.objects.filter(~Q(name='红楼梦'),price__gt='100')
res = models.Book.objects.filter(~Q(name='红楼梦')&Q(price__gt='100'))
print(res)
8.Django 分组查询
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
if __name__ == '__main__':
import django
django.setup()
from app01 import models
# 查询每一个出版社id,以及出书平均价格(单表)
# 原生sql
# select publish_id,avg(price) from book group by publish_id;
# orm实现
'''
把同一类归为一组,然后使用聚合函数操作
如果是多表,把连个表连起来,再分组,再聚合
取的字段必须是分组字段或者聚合函数的字段
标准 annotate() 内写聚合函数
values在前,表示group by 的字段
values在后,表示取字段
filter在前,表示where条件
filter在后,表示having
'''
from django.db.models import Avg,Count,Max
res = models.Book.objects.all().\
values('publish_id').\
annotate(price_ave=Avg('price')).values('publish_id','price_ave')
print(res)
# 查询出版社id大于1的出版社id,以及出书平均价格
res=models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_ave=Avg('price')).values('publish_id','price_ave')
print(res)
# 查询出版社id大于1的出版社id,以及出书平均价格大于30的
res=models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_ave=Avg('price')).filter(price_ave__gt=60).values('publish_id','price_ave')
print(res)
#查询每一个出版社出版的名称和书籍个数(连表)
# 联表的话最好以group by的表作为基表
res=models.Publish.objects.values('nid').annotate(book_count=Count('book__nid')).values('name','book_count')
# 简写成,如果基表是group by的表,就可以不写values
res=models.Publish.objects.annotate(book_count=Count('book')).values('name','book_count')
# 以book为基表
res=models.Book.objects.values('publish__nid').annotate(book_count=Count('nid')).values('publish__name','book_count')
print(res)
#查询每个作者的名字,以及出版过书籍的最高价格(建议使用分组的表作为基表)
# 多对多如果不以分组表作为基表,可能会出数据问题
res=models.Author.objects.annotate(price_max=Max('book__price')).values('name','price_max')
res=models.Book.objects.values('authors__nid').annotate(price_max=Max('price')).values('authors__name','price_max')
print(res)
#查询每一个书籍的名称,以及对应的作者个数
res=models.Book.objects.annotate(count=Count('authors')).values('name','count')
print(res)
##统计不止一个作者的图书
## 统计价格数大于10元,作者的图书
##统计价格数大于10元,作者个数大于1的图书
res=models.Book.objects.filter(price__gt=10).annotate(count=Count('authors')).filter(count__gt=1).values('name','price','count')
print(res)
网友评论