首页 > 其他分享 >图书管理系统、聚合函数、分组查询、F与Q查询

图书管理系统、聚合函数、分组查询、F与Q查询

时间:2022-12-17 11:44:47浏览次数:47  
标签:管理系统 models res price 查询 objects 分组 书籍

目录

图书管理系统

在针对数据路迁移失败时的问题, 一个数据库是只对应一个Django项目的,不要出现多个Django项目使用一个数据库 这样极其容易出现报错的得

1.表设计

首先要考虑普通字段崽考虑外键字段的数据库迁移、测试数据录入

当中自己先要确定一张最重要的表 书籍表

其他表数据:出版社表 作者表 作者详情表 还有多对多关系的由ORM自动创建的虚拟表

再对数据对数据录入时首先录入的得是出版社表和作者详情表,因为要考虑其他外键相关联 其他表先入的话没有数据来源无法录入的

2.首页搭建、展示

先路由层

image

再视图层中编写个home_func视图函数是要返回一个html页面的 再模型层中定义html文件homePage.html

image
g)

再确认主页面如何布局

image

要展示所有的图书信息

image

先要获取到所有的图书数据

image

要返回一个HTML页面 而且都是展示给用户看的信息 使用table表格标签

使用模板继承 在母板中圈出划定子板可修改的区域 block

image

母模板中至少应该标明三个区域:
页面内容、CSS样式区、JS代码区

image

继承页booklistPage在content编写的html会把母板写的替换掉

展示从1开始的有序数列 模板语法中的for循环 有一个特殊的关键 forloop(如果直接是主键展示的话将不会是有序的因为对有做修改的话将不是有序的)

image

这里要注意哦,时间是结构化时间无法展示,所以得对时间格式化。以及作者的展示,书跟作者是多对多的关系,一本书可能对应多个作者拿到的是,列表套多个对象

image

用标签的过滤器内置方法date对结构化时间做格式化处理

image

对作者for循环

image

在渲染中添加条件展示 模板语法for循环中关键字forloop

image

再添加编辑与删除按钮

书籍的添加

返回一个让用户可以输入书籍的相关数据的HTML页面

image

继承页bookAddPage在content编写的html会把母板写的替换掉

需要出版社和作者的全部数据

image

展示系统中的已有的出版社信息供选择和展示系统中已有的出版社信息供选择

image

再把用户选择的数据返回给后端

image

重定向redirect 在针对没有动态匹配的路由可以直接写

image

书籍编辑

首先要考虑在后端如何获取用户想要编辑的数据、前端如何展示出待编辑的数据?

用转换器路由匹配的方式

image
)

那么这时要注意在编写视图函数的时候传参

image

注意在添加作者以及出版社的时候要有默认值

根据编辑的书籍对象查询对应的出版社 与系统所有的出版社比对 如果有相同则添加默认选中的属性selected

image

作者默认选中

image

再传回到后端来

image
效果展示:
image

书籍删除

先编写删除接口

image

视图层视图函数

image

再对删除做一个二次确认 用到点击事件
image

聚合函数

聚合函数:

Max

Min

Sum

Count

Avg

在ORM中支持单独使用聚合函数 可以单独使用 关键字aggregate 需要导模块

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

image

分组查询

关键字annotate

如果在执行orm中出现有报错 并且有关键字sql_mode strict mode sql

	移除sql_mode中的only_full_group_by

严格模式中将only_full_group_by模式移除

show variable like '%mode%';
image

按照表分组

    models.表名.objects.annotate()                            按照表分组

题目:统计每一本书的作者个数

分析:每一本数的作者个数肯定是按书来分组,从书籍表出发到作者表,外键是在书籍手里,所以是正向查询按外键字段

    res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
    print(res)
    # models后面点的什么 annotate就按照什么进行分组

image

题目:统计出每一个出版社卖的最便宜的书的价格

分析:每一个出版社肯定是按出版社来分组,从出版社表出发到书籍表,外键是在书籍手里,所以是反向查询按表名小写

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

image

题目:统计不止一个作者的图书

分析:作者的图书不为1的 那么先要知道每一本书的作者个数 然后再筛选出大于1的。那么肯定是按书分组 从书表出发到作者表,外键在书籍手里,正向查询按外键字段

res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title', 'author_num')
print(res)

image

题目:查询每个作者出的书的总价格

分析:每个作者肯定是按作者表分组,从作者表出发到书籍表,外键字段在书籍表,反向查询按表名小写

   res = models.Author.objects.annotate(总价=Sum('book__price'),count_book=Count('book__pk')).values('name','总价','count_book')
    print(res)

image

按照字段分组

按照values括号内指定的字段分组

models.表名.objects.values('字段名').annotate()            

按出版社id分组

image

    res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk')
    print(res)

image

F与Q查询

给表中添加两个字段 库存数与卖出总数

在当你的表中有数据你再给表中添加数据的时候 是会给提示的 原来表中是有数据的 添加了新的字段就不知道要给新添加的字段写什么数据

image

1是让你添加默认值 2是让你退出去 改模型层

给新添加的字段添加默认值

image

F查询

一般都是提供具体的数值

image

当查询条件不是明确的 要查询字段来自于其他字段 也需要从数据库中获取 就需要使用F查询

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

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('新款')))

image
image

Q查询

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

将条件用Q包起来

逗号默认是and

查询主键是1和价格大于2000的书籍

res = models.Book.objects.filter(pk=1, price__gt=2000)
逗号默认是and关系

image

|是or

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

from django.db.models import Q
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000))  # |是or

~是not

查询主键不是1或者价格大于2000的书籍

res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000))  # ~是not
print(res.query)

image

标签:管理系统,models,res,price,查询,objects,分组,书籍
From: https://www.cnblogs.com/xiao-fu-zi/p/16988780.html

相关文章

  • 数据库scn以及对应的时间查询
    文档课题:数据库scn以及对应的时间查询.--查某时间段scn号selectscn,to_char(time_dp+interval'8'hour,'yyyy-mm-ddhh24:mi:ss')fromsys.smon_scn_timewhereto_......
  • 多表查询练习
    --部门表CREATETABLEdept(idINTPRIMARYKEYPRIMARYKEY,--部门iddnameVARCHAR(50),--部门名称locVARCHAR(50)--部门所在地);--添加4个部......
  • 【MySQL】自动优化查询SQL语句
    一、参考资料​​XiaoMi/soar优化工具-web版本(mac)-简书​​​​​​​​​​ ​​GitHub-xiyangxixian/soar-web:AwebUIwithsoar​​​​EverSQL|AutomaticSQL......
  • 【MySQL】MySQL性能优化与查询优化
    一、参考资料​​MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!_哔哩哔哩_bilibili​​​​《面试笔记》——MySQL终结篇(30问与答)​​​​最全MySQL优化方法,从此优化不......
  • django 07 ORM查询优化
    分组查询"""默认只能够直接获取分组的字段,其他字段需要使用方法我们也可以忽略掉该特性将sql_mode中only_full_group_by配置移除即可"""#1.统计每一本书的作者个数......
  • 聚合查询分组查询F与Q查询
    内容概要聚合查询分组查询F与Q查询内容详细聚合查询聚合函数:MaxMinSumCountAvg在ORM中支持单独使用聚合函数aggregatefromdjango.db.modelsimport......
  • 自研ORM框架 实现类似EF Core Include 拆分查询 支持自定义条件、排序、选择
    Baozi,I'mMr.ZhongIliketobrushTikTok,Iknowthatanchorsliketocallitthat,haha!Recently,Ihaven'tbeensobusy,andittookalmostadaytoaddso......
  • LINQ 查询简介 (C#)
    查询是一种从数据源检索数据的表达式。查询通常用专门的查询语言来表示。随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的SQL和用于XML的......
  • 聚合 分组以及F与Q查询
    目录djangoday06一、图书馆里系统讲解二、聚合查询三、分组查询四、F与Q查询djangoday06一、图书馆里系统讲解1.表的设计2.首页展示3.书籍查询3.书籍添加3.书籍编辑......
  • 回表查询导致 select * 比select 具体字段快
     这里使用的是postgresql 联表查询select*0.008秒 快的不寻常   一样的条件 select主键略逊一筹如果加上其他字段差的更多了,差距大概在五倍左右......