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

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

时间:2022-12-18 18:55:36浏览次数:54  
标签:Book models res price django objects 分组 查询

一、图书管理系统讲解

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

二、聚合查询

在ORM中支持单独使用聚合函数,需要使用aggregate方法。

聚合函数:Max最大、Min最小、Sum总和、Avg平均、count统计

示例1

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)

ps:我们在进行聚合查询的时候,可以给聚合查询的内容命名,如果不主动命名,也会自动用下划线拼接两个字段名,但是这里的命名不建议用中文(虽然能用)。

示例2

	    from django.db.models import Max, Min, Sum, Avg, Count
	    1.查找所有书籍中价格最高的书籍
	    res = models.Book.objects.aggregate(我是世界上最贵的书=Max('price'))
	    print(res)  # 没有分组之前如果单纯的时候聚合函数 需要关键字aggregate
	
	    2.获取书籍中最贵的 最便宜的 全部需要多少钱 平均一本书多少钱 总共有几本书
	    res1 = models.Book.objects.aggregate(Max('price'), Min('price'), Sum('price'), Avg('price'), Count('pk'))
	    print(res1)
	    
	    		'''通过 别名 = 聚合函数的方法可以取一个别名'''

image

三、分组查询

小提示:

如果执行orm分组查询报错,并且有关键字sql_mode,需要去mysql配置文件中修改严格模式的配置信息。(Mac不会有)

strict mode
	移除sql_mode中的only_full_group_by

image

    # 分组查询
    from django.db.models import Max, Min, Sum, Count, Avg
    # 统计每一本书的作者个数
    res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
    print(res)
    # 统计出每个出版社卖的最便宜的书的价格
    res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
    print(res)
    # 统计不止一个作者的图书
    # 1.先统计每本书的作者个数
    res = models.Book.objects.annotate(author_num=Count('authors__pk'))
    print(res)
    # 2.筛选出作者个数大于1的数据
    res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title',
                                                                                                        'author_num')
    print(res)
    # 查询每个作者出的书的总价格
    """
    models.表名.objects.annotate()                            按照表分组
    models.表名.objects.values('字段名').annotate()            按照values括号内指定的字段分组
    """
    res = models.Author.objects.annotate(总价=Sum('book__price'),count_book=Count('book__pk')).values('name','总价','count_book')
    print(res)

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

四、ORM中如何给表再次添加新的字段

当我们在对数据库使用ORM进行操作的时候,如果出现需要新增字段的情况,在模型层中修改了代码后,进行数据库迁移操作前,需要对新增的字段值进行设置,否则不让进行数据库迁移。

我们可以把字段值设置成一个固定的值,也可以设置字段值可以为空。

代码

		首先我们先给我们的书籍表格再添加两条数据(库存以及已销售)
		
	    storage_num = models.IntegerField(verbose_name='库存数')
		sale_num = models.IntegerField(verbose_name='已销售')
		但是出现报错了  
		we can't do that (the database needs something to populate existing rows)
		
		现在这张表已经有数据了 再添加两个新的字段 没有数据值 它的数据值呢 ?
		两种方式 一个默认值 一个退出不执行这个命令再去修改(所以我们得给他加上数据)
		
		storage_num = models.IntegerField(verbose_name='库存数', null=True)
		sale_num = models.IntegerField(verbose_name='已销售', default=1000)

如果不对新的字段值进行设置会出现一下提示:

image

五、F与Q查询

F查询

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

在用ORM进行查询的时候,我们会发现当查询条件不明确的时候不能执行语句,因此需要用到F查询。

image

Q查询

    # 查询主键是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)

image

标签:Book,models,res,price,django,objects,分组,查询
From: https://www.cnblogs.com/wwssadadbaba/p/16990763.html

相关文章

  • django总结
    内容导航django路由层内容详细django路由层1.路由匹配django2.X及以上path第一个参数些什么就匹配什么django1.X第一个参数是正则表达式无论匹配什么版本dja......
  • django 聚合查询 分组查询 f查询 q查询
    目录今日内容详细图书管理系统讲解聚合查询分组查询F与Q查询今日内容详细图书管理系统讲解1.表设计 先考虑普通字段再考虑外键字段 数据库迁移、测试数据录入2.首页......
  • 模型层之聚合查询,分组查询,F与Q查询
    目录模型层之聚合查询,分组查询,F与Q查询今日概要今日内容详细聚合查询分组查询F与Q查询模型层之聚合查询,分组查询,F与Q查询今日概要聚合查询分组查询F与Q查询今日内......
  • 聚合查询 分组查询 F与Q查询 添加新字段
    目录聚合查询aggregate聚合函数起别名分组查询annotate注释函数起别名分组查询报错分组查询练习总结添加新字段F与Q查询F查询字符串拼接concat方法Q查询Q查询之and关系Q......
  • 聚合查询、分组查询、F与Q查询
    聚合查询aggregate(*args,**kwargs)1.基本介绍介绍:聚合查询通常情况下都是配合分组一起使用的.如果你只想使用聚合函数,但是不想分组,那么就应该使用aggregate.使......
  • 配置Django后端跨域
    一:安装django-cors-headers库 pipinstalldjango-cors-headers二:配置settings.py1.注册APP(在rest_framework后面添加)#注册APPINSTALLED_APPS=['rest_......
  • DQL查询数据
    DQL查询数据!1.DQL(DataQueryLanguage数据查询语言)SELECT数据库中最核心的语言,最重要的语句狂神MySQL中p16school.sql文件(数据为部分数据)/*SQLyogUlti......
  • Mysql 中的升序、降序以及随机查询
    1.升序selecttime,Afromtable1orderbytimeasclimit10;+---------------------+---------+|time               |A      |+------......
  • django7
    图书管理系统讲解1.表设计 先考虑普通字段再考虑外键字段 数据库迁移、测试数据录入2.首页展示3.书籍展示4.书籍添加5.书籍编辑 后端如何获取用户想要编辑的数据、......
  • django框架(五)
    将某个html的部分提前写好之后很多html页面想使用就可以导入直接在要导入的地方用以下代码即可:{%include'myform.html'%}#仅适用于页面某个小的区域,不适......