图书管理系统
1.表设计
先考虑普通字段再考虑外键字段
数据库迁移、测试数据录入
2.首页展示
3.书籍展示
4.书籍添加
5.书籍编辑
后端如何获取用户想要编辑的数据、前端如何展示出待编辑的数据
6.书籍删除
聚合查询
聚合函数: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)
分组查询
# group by分组
# 分组之后只能取得分组的依据,其他的字段不能拿到
"""
如果执行orm分组查询报错 并且有关键字sql_mode strict mode
移除sql_mode中的only_full_group_by
"""
#################分组查询
'''统计每一本书的作者个数'''
# 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)
'''统计不止一个作者的图书'''
# res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gte=2).values('title','author_num')
# print(res)
'''查询各个作者出的书的总价格'''
# res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
# print(res)
"""
models.表名.objects.annotate() 按照表分组
models.表名.objects.values('字段名').annotate() 按照values括号内指定的字段分组
"""
res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk')
print(res)
F与Q查询
F查询
'''查询库存数大于卖出数的书籍'''
'''当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询'''
# from django.db.models import F
# res = models.Book.objects.filter(kucun__gt=F('maichu'))
# print(res)
'''将所有书的价格涨800'''
# from django.db.models import F
# models.Book.objects.update(price=F('price') + 800)
'''将所有书的名称尾部增加爆款'''
# from django.db.models import F
# from django.db.models import Value
# from django.db.models.functions import Concat
# res = models.Book.objects.update(title=Concat(F('title'),Value('爆款')))
Q查询
'''查询主键是1或者价格大于1000的书籍'''
# from django.db.models import Q
# res = models.Book.objects.filter(Q(pk=1), Q(price__gt=1000)) # 逗号是and关系
# res = models.Book.objects.filter(Q(pk=1)|Q(price__gt=1000)) # |是or的关系
# res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=1000)) # ~是not
# print(res)