多表查询

框架基础六-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.表名
  后面跨表查询可以直接写与他相关的表名一直连接
  __不仅可以连接表名也可以在表内再定位到字段

posted on 2022-05-18 00:56  淦白嫖怪  阅读(48)  评论(0)    收藏  举报

导航