昨日内容回顾
-
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.书籍删除
聚合查询
聚合函数: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)
分组查询
"""
如果执行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)
# 统计不止一个作者的图书
# 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)
# 查询每个作者出的书的总价格
# res = models.Author.objects.annotate(总价=Sum('book__price'),count_book=Count('book__pk')).values('name','总价','count_book')
# 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查询
# 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('新款')))
# 查询主键是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)
作业
整理今日内容及博客
1.练习图书管理系统(可以优化扩展)
2.整理本周内容
标签:__,Book,第七课,res,查询,---,models,objects
From: https://www.cnblogs.com/tengyifan888/p/16987670.html