框架基础六-orm多表查询
一.神奇的双下划线查询
1.__gt # 根据条件筛选大于的
eg:models.User.objects.filter(字段__gt=20)
2.__lt # 根据条件筛选小于的
3.__gte # 根据条件筛选大于等于的
4.__lte # 根据条件筛选小于等于的
5.__in # 成员运算
eg:models.User.object.filter(age__in[1,2,3])
6.__range # 范围查找包含两头
eg:models.User.objects.filter(age__range=[2,5])
7.__contains # 模糊查询加i就是让它忽略大小写
eg:models.User.objects.filter(name__contains='j')
8.__startwith/__endwith # 查询以什么开头或结尾的
9.__regex # 正则匹配
10.__month # 以月份作为筛选条件
eg:models.User.objects.filter(op_time__month=5)
11.__year # 以年份作为筛选条件
二.外键字段的创建
1.ForeignKey # 创建关系一对多外键的关键字
2.ManyToManyField # 创建关系多对多的外键的关键字
orm自动创建第三张表
3.OneToOneField # 创建关系为一对一的外键关键字
4.to # 用于指定跟那张表有关系会自动关联主键
eg:models.ForeignKey(to='关联表表名')
5.to_field\to_fields # 也可以自己关联主键指定字段
# 针对django2.0以上版本创建一对一关系还要写两个参数db_constraint=Ture,以及on_delete=models.CASCADE
三.外键字段操作
# 一对一关系操作表
1.创建外键字段
方式一直接写关联字段的值
models.Book.objects.create(title='人工只能',price=1999.99,publish_id=1)
方式二先取出要添加外键这个对象然后用原字段=这个对象publish_obj=models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='红楼梦',price=134.22,publish=publish_obj)
2.修改字段
方式一 models.Book.objects.filter(pk=2).update(publish_id=2)
方式二
publish_obj = models.Publish.objects.filter(pk=4).first()
models.Book.objects.filter(pk=2).update(publish=publish_obj)
3.删除就是找到之后.delete()
# 多对多关系操作表
1.第一步先获取一个表中的一个对象
book_obj=models.Book.objects.filter(pk=1).first()
2.第二步通过点的方式跨表查询
book_obj.author.add(1)
3.对象.外键字段名.方法(参数为列表或者关联表id)
一个数据就建一个关系,几个数据就表示这个对象的多个关系
也可以将数字换成一个对象或者多个对象
# 第三张表修改数据
1.方式与添加一样将关键字修改成set参数写成列表
2.会将之前的操作都删除,遵循列表内的值或者是对象
# 第三张表移除关系
1.将关键字修改成remove参数可以是数字和对象支持放多个
# 将一个对象在第三张表中的关系全部删除
1.先拿到对象用关键字clear
四.多表查询
# 正反向概念
1.正向查询就是当前数据对象含有外键字段
2.反向查询就是当前数据对象没有外键
# 判断有无外键使用
1.正向查询按外键字段名
2.反向查询就是用表名小写
五.基于对象的跨表查询
#拿关联表中的对象
1.查询数据分析书籍对应的出版社
book_obj=models.Book.objects.filter(title='数据分析').first()
res=book_obj.publish.name
2.查询python全栈开发对应的作者
book_obj=models.Book.objects.filter(title='python全栈开发').first()
print(book_obj)
res=book_obj.authors.all()#<QuerySet [<Author: 作者对象:jason>, <Author: 作者对象:tony>]>
3.查询作者jason的详情信息
author_obj=models.Author.objects.filter(name='jason').first()
res=author_obj.author_detail # 拿到的对象
4.查询东方出版社出版的书籍
publish_obj=models.Publish.objects.filter(name='东方出版社').first()
res=publish_obj.book_set.all() # queryset对象
5.查询jason编写的书籍
author_obj=models.Author.objects.filter(name='jason').first()
res=author_obj.book_set.all() # queryset对象
6.查询电话是110的作者
info_obj=models.AuthorDetail.objects.filter(phone=110).first()
res=info_obj.author # 拿到的是对象
六.基于上下划线的跨表查询
1.查询数据分析书籍对应的出版社名称
book_obj1=models.Book.objects.filter(title='数据分析').first().publish.name
book_obj=models.Book.objects.filter(title='数据分析').values('publish__name','publish__addr')
2.查询python全栈开发对应的作者姓名和年龄
book_obj=models.Book.objects.filter(title='python全栈开发').values('authors__name','authors__age')
3.查询作者jason的手机号和地址
res=models.Author.objects.filter(name='jason').values('author_detail__phone','author_detail__addr')
.first()
4.查询东方出版社出版的书籍名称和价格
res=models.Publish.objects.filter(name='东方出版社').values('book__title','book__price').first()
5.查询jason编写的书籍名称和日期
res=models.Author.objects.filter(name='jason').values('book__title','book__publish_time').first()
6.查询电话是110的作者的姓名和年龄
res=models.AuthorDetail.objects.filter(phone=110).values('author__name','author__age').first()
print(res)
七.双下划线扩展
# 反向
'''限制条件:手上有条件所在的表不能被models点 需要点最终的目标数据对应的表'''
1.查询数据分析书籍对应的出版社名称
res=models.Publish.objects.filter(book__title='数据分析').values
2.查询python全栈开发对应的作者姓名和年龄
res=models.Author.objects.filter(book__title='python全栈开发').values('name','age')
3.查询作者jason的手机号和地址
res=models.AuthorDetail.objects.filter(author__name='jason').values('phone','addr')
4.查询东方出版社出版的书籍名称和价格
res=models.Book.objects.filter(publish__name='东方出版社').values('title','price')
5.查询jason编写的书籍名称和日期
res=models.Book.objects.filter(authors__name='jason').values('title','publish_time')
6.查询电话是110的作者的姓名和年龄
res=models.Author.objects.filter(author_detail__phone=110).values('name','age')
# 连续跨表操作
查询python全栈开发对应的作者的手机号
方式一:res=models.Book.objects.filter(title='python全栈开发').values('author__author_detail__phone')
方式二:res1 = models.AuthorDetail.objects.filter(author__book__title='python全栈开发').values('phone')
# 获取多张表内的字段数据
res = models.Book.objects.filter(title='python全栈开发').values('authors__author_detail__phone','authors__name','title')
八.如何查看SQL语句
1.对于结果是queryset对象的可以直接点query查看
2.配置文件中固定配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
1.针对于多表查询可以models.表名
后面跨表查询可以直接写与他相关的表名一直连接
__不仅可以连接表名也可以在表内再定位到字段