框架第七课---图书管理系统讲解,ORM 聚合查询,分组查询,F与Q查询,test.py文件操作

昨日内容回顾

  • ORM执行查询SQL语句

    1.raw()
    	查询关键字
    2.connection模块
    	from django.db import connection
    3.pymysql模块
    
  • 神奇的双下划线查询

    __gt			大于
    __lt			小于
    __gte			大于等于
    __lte			小于等于
    __in			成员运算
    __range			范围查询
    __contains		 模糊查询(区分大小写)
    __icontains     模糊查询(不区分大小写)
    __year\month\day  日期截断处理
    
  • ORM外键字段的创建

    一对多
    	p = models.ForeignKey(to='表名',on_delete=models.CASCADE)
    	在多的表中建立外键字段
    	会在表中产生一个实际的字段(自动加_id后缀)  		 p_id
        
    一对一
    	a = models.OneToOneField(to='表名',on_delete=models.CASCADE)
     	在查询频率较高的表中建立外键字段
    	会在表中产生一个实际的字段(自动加_id后缀)        a_id
        
     多对多
    	b = models.ManyToManyField(to='表名')
     	在查询频率较高的表中建立外键字段(ORM自动创建第三张表你也可以自己创)
    	不会在表中产生实际字段 而是告诉ORM创建第三张关系表
    
  • 外键字段数据的增删改查

    一对多与一对一
    	p = 关联的数据对象
    	p_id = 关联的数据主键值
     	a = 关联的数据对象
     	a_id = 关联的数据主键值
        
     多对多
    	add()	(1,)  (1,2,3) (author_obj,) (author_obj1,author_obj2)
     	set()   set((1,))  set((1,2))  set((author_obj,...))
     	remove() 同add
    	clear()	 不需要传参
    
  • ORM跨表查询

    """
    针对数据库迁移失败的问题
    	一个数据库尽量只对应一个django项目
    	不要出现多个django项目使用一个数据库 极其任意报错
    """
    1.正反向查询的概念
    	核心就在于外键字段在谁那儿 
    		正向查询按外键字段
     		反向查询按表名小写
        
    2.基于对象的跨表查询(子查询)
    	1.先根据已知条件获取到一个具体的数据对象
        	book_obj = models.Book.objects.filter(pk=1).first()
    	2.基于该数据对象运用正反向查询的口诀完成
     		book_obj.authors.all()
            
    3.基于双下划线的跨表查询(连表操作)
    	正反向的口诀也使用与values或者values_list中使用
     		models.Book.objects.filter(pk=1).values('publish__name')
       
    4.进阶操作
    	正反向的口诀也可以在filter中使用
        	models.Book models.Publish models.Author
    

今日内容概要

  • 图书管理系统讲解
  • 聚合查询
  • 分组查询
  • F与Q查询
  • ORM查询优化
  • 模型层常用字段及参数

今日内容详细

图书管理系统讲解

详见下一个博客

1.表设计
	先考虑普通字段再考虑外键字段
	数据库迁移、测试数据录入
2.首页展示
3.书籍展示
4.书籍添加
5.书籍编辑
	后端如何获取用户想要编辑的数据、前端如何展示出待编辑的数据
6.书籍删除

.

小总结 涉及到的django模块导入

视图层用
from django.http import JsonResponse
---------------------------------------
模型层用
from django.db import models
---------------------------------------
路由层用
from django.urls import path
---------------------------------------
测试文件用
import django
django.setup()
---------------------------------------
视图层用(shortcuts捷径)
from django.shortcuts import render, HttpResponse, redirect, reverse
---------------------------------------
使用聚合函数时用
from django.db.models import Max, Min, Sum, Count, Avg

.

聚合查询 对应的就是sql里面的聚合函数

aggregate vt. & vi. (使)聚集 /'æɡrɪɡət/

聚合函数:Max Min Sum Count Avg
在ORM中支持不分组也能单独使用聚合函数!! 关键字: aggregate
-----------------------------------------------
from django.db.models import Max, Min, Sum, Count, Avg

res = models.Book.objects.aggregate( Count('pk'), 最小价格=Min('price'), allPrice=Sum('price'),平均价格=Avg('price'))

print(res)

# 注意聚合函数的首字母都是大写的!!!写错了不会飘颜色,很难发现!!!

.
.
.
.

分组查询

"""
如果执行orm分组查询报错 并且有关键字group by
移除my.ini文件中  sql_mode中的 only_full_group_by
然后管理员打开cmd 再重启服务端
net stop mysql
net start mysql
"""

image
.
.

分组查询练习 重要!!!

分组查询的练习题,可以使用到培训课视频里面框架day07里面的代码,然后在test.py里面进行测试

关键字:annotate  注释;给…作注释或评注;不知道怎么有分组的意思的
----------------------------------------------------
注意annotate的括号里面的聚合函数是可以用到双下方法的,正反向连表都能用!!!
----------------------------------------------------
作者表语书表,多对多的外键字段在书表里面!!!
1. 统计每一本书的作者个数(按书分组,聚合函数里面利用外键authors正向连表,然后用count对author表里面pk字段进行计数 )
res1 = models.Book.objects.annotate(Count('authors__pk'))

res = models.Book.objects.annotate(
author_num=Count('authors__pk')).values('title', 'author_num')
# models后面点的是哪个表,就是以哪个表里面pk字段进行分组!!!
# annotate()括号里面一般写聚合函数并给聚合函数起个别名,方便后面的values拿对应的别名
print(res)

----------------------------------------------------
2. 统计出每个出版社卖的最便宜的书的价格(按出版社分组,聚合函数里面利用表名小写反向连表,然后用min对书表里面price字段进行求最小值 )

res = models.Publish.objects.annotate(min_price=Min(
'book__price')).values('name', 'min_price')

print(res)
----------------------------------------------------
----------------------------------------------------
3. 统计不止一个作者的图书的图书名与对应的作者个数
# 1.先统计每本书的作者个数
res = models.Book.objects.annotate(author_num=Count('authors__pk'))
---
# 2. 筛选出作者个数大于1的数据
res = models.Book.objects.annotate(author_num=Count(
'authors__pk')).filter(author_num__gt=1).values('title','author_num')

print(res)

此处的filter等价于sql里面having  在分组后再筛选了!!!
----------------------------------------------------
----------------------------------------------------
4. 查询每个作者出的书的总价格(按作者分组,聚合函数里面利用表名小写反向连表,然后用Sum对书表里面price字段进行求最小值 )

res = models.Author.objects.annotate(sum_price=Sum('book__price')).values(
'name','sum_price')

print(res)
----------------------------------------------------
5. 查询每个作者出了几本书及书的总价格(按作者分组,再用Count对书表里面的pk字段进行计数
res = models.Author.objects.annotate(sum_price=Sum('book__price'),count_book=Count('book__pk')).values('name','sum_price','count_book')

print(res)
----------------------------------------------------
"""
    models.表名.objects.annotate()
    按照models后面的表里面的pk分组!!!
------------------------------------------
    models.表名.objects.values('字段名').annotate()
    按照values括号内指定的字段分组!!!
"""
----------------------------------------------------
6. 查询每一个出版社出了几本书??   正好书表里面有外键字段 出版社id
先按 出版社id 字段分组  再利用聚合函数 对 分过组后的书的id计数
res = models.Book.objects.values('publish_id').annotate(
count_pk=Count('pk')).values('publish_id', 'count_pk')

print(res)
----------------------------------------------------

.
.
.

F与Q查询

''' 当需要字段和字段作比较的时候用F查询 '''

''' 当查询条件是 或 的时候 用Q查询,因为默认的filter参数都是且的关系 '''


# 1. 查询库存数大于卖出数的书籍

'''当查询条件也就是等号右边不是明确的,查询条件也需要从数据库中获取 就需要使用F查询'''

from django.db.models import F
res = models.Book.objects.filter(kucun__gt=F('maichu'))
print(res)

------------------------------------------------------
# 2. 将所有书的价格涨800

models.Book.objects.update(price=F('price') + 800)
------------------------------------------------------
# 3. 将所有书的名称后面追加爆款

from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'), Value('新款')))

------------------------------------------------------
# 4. 查询主键是1或者价格大于2000的书籍

res = models.Book.objects.filter(pk=1, price__gt=2000)    # 逗号默认是and关系
from django.db.models import Q
res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000))     # 逗号是and
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000))    # |是or
res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000))    # ~是not
print(res.query)

.
.
.

test.py文件操作,测试ORM语句是否有问题

先复制manage.py文件里面的前4行代码到test.py文件里面去
再写两行代码后
import django
django.setup()
就可在写要测试的ORM语句了

最后要查看运行结果别忘了,运行main()函数

image
.
image
.
.
.

作业

整理今日内容及博客
1.练习图书管理系统(可以优化扩展)
2.整理本周内容
posted @   tengyifan  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 分享4款.NET开源、免费、实用的商城系统
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
点击右上角即可分享
微信分享提示