今日考题
"""
答案
1.必知必会N条都有哪些,每个都是干啥使的
all() 查所有
filter() 查询带条件的
get() 查询带条件的,但是条件不成立会报错,所以不经常用
values() 获取指定的字段的数据,返回一个queryset对象,列表套字典
values_list() 获取指定的字段的数据,queryset,列表套元组
count() 查询统计出来的数据个数
first()
last()
exclude() 除...之外
order_by 排序 默认升序 参数前面加负号是降序
reverse 反转,必须在排序之后才可以使用
distinct 去重(要去除主键)
exists() 判断是否有值,返回t/f
2.简述神奇的双下划线查询都有哪些方法,作用是什么
__gt 大于
__lt 小于
__gte 大于等于
__lte 小于等于
__in 在不在多个数据之内 便是或关系
__range 在不在多个数据之内 是包括报喜
__month 查询月份
__year 查询年份
__contains 模糊查询
__icontains 忽略大小写的模糊查询
3.针对多对多外键字段的增删改查方法有哪些,各有什么特点?
add
remove
:上述方法括号里面放数字或者对象都可以,都可以放多个
set:括号里面放可迭代对象eg:列表 可以放对象也可以放数字,也可以放一个,但必须放可迭代对象
clear:括号内无需传值,直接清空所有
4.什么是正反向的概念,及查询口诀,你能否总结一下正反向查询不同情况下点击不同字段的规律
正向:主键在自身,要查外表
反向:主键不在自身,要查主键在的表
正向查询按外键字段,反向查询按表名小写
正向在values里面做文章
反正在filter里面做文章
内容回顾
- 单表的增删改查
# 增
1.create()
2.对象.save()
# 查
1.all() 查所有
2.filter() 筛选条件,括号内多个参数之间逗号隔开并且默认是and关系
3.get() 筛选条件,条件不存在直接报错 所以不推荐使用
# 改
1.update() queryset对象帮你封装的批量更新
2.对象.save()
# 删
1.delete() queryset对象帮你封装的批量删除
2.对象.delete()
"""
在实际的项目中 数据是不可能真正删除的 一般情况下都用一个字段来标记是否删除
"""
- 测试环境准备
# 你如果只想测试django某一个py文件(大部分情况下就是models.py)
# 在应用下的tests.py或者自己新建一个任意名称py文件(tests.py)
"""
1.去manage.py拷贝前四行
2.自己书写两行
import django
django.setup()
"""
- 如何查看orm内部的sql语句
# 1.queryset对象可以直接点query查看
queryset对象.query
# 2.配置文件配置日志相关代码即可(不要记 直接拷贝使用即可)
参考笔记或者博客自己保存好
- 必知必会N多条
# 1.all()
# 2.filter()
我们在利用数据的主键字段筛选数据的时候,可以不考虑主键字段叫什么,直接使用pk代替
# 3.get()
# 4.values()
获取指定字段对应的数据 返回的结果是一个queryset对象(列表套字典的形式)
# 5.values_list()
获取指定字段对应的数据 返回的结果是一个queryset对象(列表套元祖的形式)
# 6.count()
统计查询出来的数据个数
# 7.first()
# 8.last()
# 9.order_by()
默认是升序,你可以在字段前面加一个负改为降序
# 10.reverse()
前面必须是已经排讯过了 才能生效
# 11.exclude()
排除...在外
# 12.distinct()
去重(主键一定不要忘了)
# 13.exists()
判断数据集是否有值 返回布尔值
- 神奇的双下划线查询
# 价格大于 小于 大于等于 小于等于
price__gt
price__lt
price__gte
price__lte
# 成员查询
price__in
# 范围查询
price__range
# 模糊查询
title__contains 默认是区分大小写的
title__icontains 忽略大小写
# 只按照年份或者月份或者...
create_time__year
craete_time__month
- 外键字段的增删改查
# 一对多
publish_id = 1
punlish = publish_obj
# 多对多
add
remove
上述两个方法括号内即可以传数字也可以传对象并且都支持多个
set
括号内必须传一个可迭代对象 可迭代对象里面的元素可以数字也可以对象并且都支持多个
clear
括号内无需给任何参数,直接清空对应的关系数据
- 多表查询
# 正反向的概念
正向
外键字段就在我手中
反向
外键字段不再我手中
# 小口诀
正向查询按外键字段
反向查询按表名小写
_set
.all()
# 温馨提示
书写orm语句跟书写sql语句一样,不要试图一次性写完,可以分步书写
"""
多表操作
1.子查询
2.联表操作
inner join
left join
right join
union
Django orm中
1.基于对象的跨表查询
子查询
1.先拿到一个数据对象
2.对象点点点
2.基于双下划线的跨表查询
联表操作
"""
1.基于对象的跨表查询
book_obj.publish
book_obj.authors.all()
author_obj.author_detail
publish_obj.book_set # App01.Book.None
publish_obj.book_set.all()
author_obj.book_set.all()
author_detail.author
2.基于双下划线的跨表查询
models.Book.objects.filter(pk=1).values('title','publish__name')
models.Publish.objects.filter(book__id=1).values('book__title','name')
# 利用双下划线的跨表查询可以帮助你跨N多张表,只要有外键字段
models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
# 图书管理系统 图书的增删改查
内容概要
- 聚合查询(聚合函数的使用)aggregate
max、min、sum、count、avg
- 分组查询(group by的使用)annotate
- F与Q查询
- django中如何开启事务
- orm中常用字段及参数
- 数据库查询优化(only与defer、select_related与prefetch_related)
- 图书管理系统讲解
今日内容详细
聚合查询
只要是跟数据库相关的模块
分组查询
# 分组查询 annotate
F与Q查询
# F查询
django中如何开启事务
"""
orm中常用字段及参数
AutoField
数据库查询优化
only与defer