首页 > 其他分享 >12.15

12.15

时间:2022-12-15 20:12:09浏览次数:43  
标签:obj models res 查询 filter 12.15 objects

今日内容

1.ORM执行SQL语句

2.双下划线查询

3.ORM外键字段的创建

4.外键字段操作

5.ORM跨表查询

6.基于对象的跨表查询

7.基于双下划线的跨表查询

8.跨表查询进阶操作

1.ORM执行SQL语句

有时候ORM的操作效率可能偏低,我们是可以自己编写SQL的
方式1:
	 models.User.objects.raw('select * from app01_user;')
方式2:
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute('select name from app01_user;')
    print(cursor.fetchall())

2.双下划线查询

只要还是queryset对象就可以无限制的点queryset对象的方法      queryset.filter().values().filter().values_list().filter()...
    
  查询年龄大于18的用户数据
    # res = models.User.objects.filter(age__gt=18)
    # print(res)
  查询年龄小于38的用户数据
    # res = models.User.objects.filter(age__lt=38)
    # print(res)
  大于等于  小于等于
    # res = models.User.objects.filter(age__gte=18)
    # res = models.User.objects.filter(age__lte=38)
  查询年龄是18或者28或者38的数据
    # res = models.User.objects.filter(age__in=(18, 28, 38))
    # print(res)
  查询年龄在18到38范围之内的数据
    # res = models.User.objects.filter(age__range=(18, 38))
    # print(res)
  查询名字中含有字母j的数据
    # res = models.User.objects.filter(name__contains='j')  # 区分大小写
    # print(res)
    # res = models.User.objects.filter(name__icontains='j')  # 不区分大小写
    # print(res)
  查询注册年份是2022的数据
    # res = models.User.objects.filter(register_time__year=2022)
    # print(res)

3.ORM外键字段的创建

MySQL外键关系
	一对多:外键字段建在多的一方
	多对多:外键字段统一建在第三张关系表
	一对一:建在任何一方都可以 但是建议建在查询频率较高的表中


1.创建基础表(书籍表、出版社表、作者表、作者详情)
2.确定外键关系
	一对多:ORM与MySQL一致,外键字段建在多的一方
 	多对多:ORM比MySQL有更多变化
    1.外键字段可以直接建在某张表中(查询频率较高的)内部会自动帮你创建第三张关系表
  	 2.自己创建第三张关系表并创建外键字段
	一对一:ORM与MySQL一致,外键字段建在查询较高的一方     
3.ORM创建
	 一对多和一对一同步到表中之后会自动加_id的后缀
    	publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
	 	author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
    针对多对多,不会在表中有展示,而是创建第三张表
    	authors = models.ManyToManyField(to='Author')   

4.外键字段操作

针对一对多,插入数据可以直接填写表中的实际字段
    #models.Book.objects.create(title='三国演义', price=888.88, publish_id=1)
    #models.Book.objects.create(title='人性的弱点', price=777.55, publish_id=1)
针对一对多,插入数据也可以填写表中的类中字段名
    #publish_obj = models.Publish.objects.filter(pk=1).first()
    #models.Book.objects.create(title='水浒传', price=555.66, publish=publish_obj)
    '''一对一与一对多 一致'''
    既可以传数字也可以传对象
 
针对多对多关系绑定
    # book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.add(1)  # 在第三张关系表中给当前书籍绑定作者
    # book_obj.authors.add(2, 3)
    # book_obj = models.Book.objects.filter(pk=4).first()
    # author_obj1 = models.Author.objects.filter(pk=1).first()
    # author_obj2 = models.Author.objects.filter(pk=2).first()
    # book_obj.authors.add(author_obj1)
    # book_obj.authors.add(author_obj1, author_obj2)
    # book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.set((1, 3))  # 修改关系
    # book_obj.authors.set([2, ])  # 修改关系
    # author_obj1 = models.Author.objects.filter(pk=1).first()
    # author_obj2 = models.Author.objects.filter(pk=2).first()
    # book_obj.authors.set((author_obj1,))
    # book_obj.authors.set((author_obj1, author_obj2))
    # book_obj.authors.remove(2)
    # book_obj.authors.remove(1, 3)
    # book_obj.authors.remove(author_obj1,)
    # book_obj.authors.remove(author_obj1,author_obj2)
    book_obj.authors.clear()	
    add()\remove()		多个位置参数(数字 对象)
    set()			   可迭代对象(元组 列表) 数字 对象 
    clear()			   情况当前数据对象的关系

5.ORM跨表查询

MySQL跨表查询
 子查询
	分步操作:将一条SQL语句用括号括起来当做另外一条SQL语句的条件
 连表操作
	先整合多张表之后基于单表查询即可
			inner join	内连接
			left join	左连接
			right join	右连接

正反向查询的概念(重要)
	正向查询:由外键字段所在的表数据查询关联的表数据 正向
 	反向查询:没有外键字段的表数据查询关联的表数据	 反向
 	ps:正反向的核心就看外键字段在不在当前数据所在的表中
 
ORM跨表查询的口诀(重要)
	正向查询按外键字段
	反向查询按表名小写

6.基于对象的跨表查询

正向查询

对象查找(跨表)

语法:对象.关键字.字段

要点:先拿到对象,再通过对象去查对应的外键字段,分两步

1.查询主键为1的书籍对应的出版社名称
    先根据条件获取数据对象
    # book_obj = models.Book.objects.filter(pk=1).first()
    再判断正反向的概念,由书查出版社,外键字段在书所在的表中,是正向查询
    # print(book_obj.publish.name)

2.查询主键为4的书籍对应的作者姓名
    先根据条件获取数据对象
    # book_obj = models.Book.objects.filter(pk=4).first()
    再判断正反向的概念,由书查作者,外键字段在书所在的表中,所以是正向查询
    # print(book_obj.authors)  # app01.Author.None
    # print(book_obj.authors.all())
    # print(book_obj.authors.all().values('name'))
3.查询jason的电话号码
    #author_obj = models.Author.objects.filter(name='jason').first()
    #print(author_obj.author_detail.phone)


反向查询

对象查找

语法:obj.表名_set

要点:先拿到外键关联多对一,一中的某个对象,由于外键字段设置在多的一方,所以这里还是借用Django提供的双下划线来查找

4.查询北方出版社出版过的书籍
    # publish_obj = models.Publish.objects.filter(name='北方出版社').first()
    # print(publish_obj.book_set)  # app01.Book.None
    # print(publish_obj.book_set.all())

5.查询jason写过的书籍
    # author_obj = models.Author.objects.filter(name='jason').first()
    # print(author_obj.book_set)  # app01.Book.None
    # print(author_obj.book_set.all())

6.查询电话号码是110的作者姓名
    #author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    #print(author_detail_obj.author)
    #print(author_detail_obj.author.name)

7.基于双下划线的跨表查询

1.查询主键为1的书籍对应的出版社名称
    # res = models.Book.objects.filter(pk=1).values('publish__name','title')
    # print(res)
2.查询主键为4的书籍对应的作者姓名
    # res = models.Book.objects.filter(pk=4).values('title', 'authors__name')
    # print(res)
3.查询jason的电话号码
    # res = models.Author.objects.filter(name='jason').values('author_detail__phone')
    # print(res)

4.查询北方出版社出版过的书籍名称和价格
    # res = models.Publish.objects.filter(name='北方出版社').values('book__title','book__price','name')
    # print(res)

5.查询jason写过的书籍名称
    # res = models.Author.objects.filter(name='jason').values('book__title', 'name')
    # print(res)

6.查询电话号码是110的作者姓名
    res = models.AuthorDetail.objects.filter(phone=110).values('phone', 'author__name')
    print(res)

8.跨表查询进阶操作

1.查询主键为1的书籍对应的出版社名称
  # res = models.Publish.objects.filter(book__pk=1).values('name')
    # print(res)
2.查询主键为4的书籍对应的作者姓名
    # res = models.Author.objects.filter(book__pk=4).values('name','book__title')
    # print(res)
3.查询jason的电话号码
    # res = models.AuthorDetail.objects.filter(author__name='jason').values('phone')
    # print(res)
4.查询北方出版社出版过的书籍名称和价格
    # res = models.Book.objects.filter(publish__name='北方出版社').values('title','price')
    # print(res)
5.查询jason写过的书籍名称
    # res = models.Book.objects.filter(authors__name='jason').values('title')
    # print(res)
6.查询电话号码是110的作者姓名
    #res = models.Author.objects.filter(author_detail__phone=110).values('name')
    #print(res)
7.查询主键为4的书籍对应的作者的电话号码
    # res = models.Book.objects.filter(pk=4).values('authors__author_detail__phone')
    # print(res)
    # res = models.AuthorDetail.objects.filter(author__book__pk=4).values('phone')
    # print(res)
    #res = models.Author.objects.filter(book__pk=4).values('author_detail__phone')
    #print(res)

标签:obj,models,res,查询,filter,12.15,objects
From: https://www.cnblogs.com/yueq43/p/16985925.html

相关文章

  • 闲话/社论 22.12.15 两道计数题
    闲话好今天闲话终于有点拿得出手的东西了向计数巨佬们致以敬意和谢意。既然代码之后补了,那我这也少写点闲话吧(一会再补!下面是社论部分!两道计数题首先感谢jijidawan......
  • OAuthApp v1.12.15 更新 | 前端发布工具
    OAuthApp是一个前端发布工具,用于快速开发前端网页项目,并发布到服务器。具有引入脚本库就能使用服务端API在线发布H5,数据独立存储的特性更新内容:1,新增角色/权限管理......
  • 力扣每日一题2022.12.15---1945. 字符串转化后的各位数字之和
    给你一个由小写字母组成的字符串s,以及一个整数k。首先,用字母在字母表中的位置替换该字母,将s转化为一个整数(也就是,'a'用1替换,'b'用2替换,...'z'用26替换)。......