ORM执行原生SQL语句、双下划线数据查询、ORM外键字段的创建、外键字段的相关操作、ORM跨表查询、基于对象的跨表查询、基于双下划线的跨表查询、进阶查询操作

今日内容

ORM执行SQL语句

有时候ROM的操作效率可能偏低 我们是可以自己编写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())

神奇的双下划线查询

只要是queryset对象就可以无限制的点queryset对象的方法 

queryset.filter().values().filter().values_list().filter()...

大于 小于

__gt		大于
__lt        小于

大于等于 小于等于

__gte		大于等于
__lte		小于等于

或1 或2 或3

__in(1,2,3)

在1-10范围内

__range(1,10)

是否含有'j'

__contains='j'  #区分大小写
__icontains='j' #不区分大小写

查询注册年份

register_time_year = 2022
'''针对django框架时区问题 是需要配置文件中修改的 后续bbs讲解'''

ORM外键字段的创建

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

1.创建四张表

书籍表、出版社表、作者表、作者详情

image

2.确定外键关系

一对多 ORM与MYSQL一致 外键字段建在多的一方

多对多 ORM比MYSQL有变化
	1.外键字段可以直接建在某张表中(查询频率较高的)
    	内部会自动帮你创建第三张关系表
    2.自己创建第三张关系表 并创建外键字段
    	详情后续讲解
        
一对一 OPM与MYSQL一致 外键字段建在查询较高的一方

3.ORM外键字段的创建

针对一对多和一对一同步到表中会自动加_id的后缀

publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
     注意:django1.x版本默认外键字段都是级联更新级联删除的 django2.x及以上版本需要自己声明
    
针对多对多 不会再表中有展示 而是创建第三张表
authors = models.ManyToMangField(to='Author')

image

外键字段相关操作

针对一对多添加关系

#插入数据可以直接写表中的实际字段
models.Book.objects.create(name='火浒传',price=6.66,publish_id=1)

#插入数据可以直接表中的类中字段名
publish_obj = models.Publish.objects.filter(pk=1).first()
#先获取到对象 
models.Book.objects.create(name='四国演义',price=3.33,publish=publish_obj)
#将获取到的对象插入

'''一对一与一对多 一致'''
即可以传数字也可以传对象

针对多对多添加关系

book_obj = models.Book.objects.filter(pk=12).first()
#获取书籍对象
book_obj.authors.add(3)
book_obj.authors.add(3,2)
#在第三张表中给数据对象绑定作者 支持一个或多个 (作者主键)

book_obj =
	models.Book.objects.filter(pk=1).first()
    
author_obj=
	models.Author.objects.filter(pk=2).first()
    
author_obj2=
	models.Author.objects.filter(pk=1).first()
    
book_obj.author.addd(author_obj2)
#(作者对象)

修改关系

book_obj =
	models.Book.objects.filter(pk=10).first()
book_obj.authors.set((2,1))
book_obj.authors.set([2,])
#直接传外键 元组要加号	

book_obj =
	models.Book.objects.filter(pk=10).first()
author_obj=
	models.Author.objects.filter(pk=1).first()
book_obj.authors.set((author_obj))
#直接传对象

删除关系

book_obj =
   models.Book.objects.filter(pk=12).first()
book_obj.authors.remove(2)
 #移除这本书和2的绑定关系 
    
book_obj =
   models.Book.objects.filter(pk=12).first()
author_obj=
	models.Author.objects.filter(pk=1).first()
book_obj.authors.remove((author_obj))
#直接传数据

book_obj.authors.clear()#把这本书的关系全部清掉
add()\remove()		多个位置参数(数字 对象)
set()				可迭代对象(元组 列表)数字 对象
clear()				清空当前数据对象的关系

ORM跨表查询

mysql跨表查询

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

正反向查询

正向查询
	由外键字段所在的表数据查询关联的表数据 
    有外键字段 去查别人
    
反向查询
	没有外键字段的表数据查询关联的表数据
    没有外键 去查别人
    
ps:正反向核心就看外键在不在当前的数据表中


ORM跨表查询口诀
	正向查询按外键字段
    反向查询按表名小写

基于对象的跨表查询

正向查询

1.查询主键为7的书籍对应的出版社名称
    book_obj= models.Book.objects.filter(pk=7).first()
    print(book_obj.publish.name)
2.查询主键为10的书籍对应的作者
    book_obj = models.Book.objects.filter(pk=10).first()
    print(book_obj.authors.all().values('name'))
3.查询joyce的电话号码    author_obj=models.Author.objects.filter(name='joyce').first()
    print(author_obj.author_detail.phone)

反向查询

1.查询月月出版社出版的书籍名称
    publish_obj = models.Publish.objects.filter(name='月月出版社').first()
    print(publish_obj.book_set.all().values())
2.查询kevin写过的书
    author_obj = models.Author.objects.filter(name='kevin').first()
    print(author_obj.book_set.all().values('name'))
3.查询电话号码是33333333333的作者姓名
    Author_Detailed_obj = models.Author_Detailed.objects.filter(phone=33333333333).first()
    print(Author_Detailed_obj.author.name)

基于上下划线的跨表查询

1.查询主键为7的书籍对应的出版社名称   book_obj=models.Book.objects.filter(pk=7).values('publish__name')
print(book_obj)

2.查询主键为10的书籍对应的作者   book_obj=models.Book.objects.filter(pk=10).values('authors__name')
print(book_obj)

3.查询joyce的电话号码
author_obj=
models.Author.objects.filter(name='joyce').values('author_detail__phone')
print(author_obj)

4.查询月月出版社出版的书籍名称   publish_obj=models.Publish.objects.filter(name='月月出版社').values('book__name')
print(publish_obj)
5.查询kevin写过的书
author_obj = models.Author.objects.filter(name='kevin').values('book__name')
print(author_obj)
6.查询电话号码是33333333333的作者姓名
Author_Detailed_obj = models.Author_Detailed.objects.filter(phone=33333333333).values('author__name')
print(Author_Detailed_obj)

进阶操作

s.Publish.objects.filter(book__pk=7).values('name')
    print(res)
    # 2.查询主键为10的书籍对应的作者
    res = models.Author.objects.filter(book__pk=10).values('name')
    print(res)
    # 3.查询joyce的电话号码
    res = models.Author_Detailed.objects.filter(author__name='joyce').values('phone')
    print(res)
    # 1.查询月月出版社出版的书籍名称
    res = models.Book.objects.filter(publish__name='月月出版社').values('name')
    print(res)
    # 2.查询kevin写过的书
    res = models.Book.objects.filter(authors__name='kevin').values('name')
    print(res)
    # 3.查询电话号码是33333333333的作者姓名
    res = models.Author.objects.filter(author_detail__phone=33333333333).values('name')
    print(res)
posted @ 2022-12-15 21:04  李李大冒险  阅读(66)  评论(0编辑  收藏  举报
  1. 1 不可撤销
  2. 2 小年兽 程嘉敏
  3. 3 迷人的危险3 FAFA
  4. 4 山楂树之恋 程佳佳
  5. 5 summertime cinnamons / evening cinema
  6. 6 不谓侠(Cover 萧忆情Alex) CRITTY
  7. 7 神武醉相思(翻自 优我女团) 双笙(陈元汐)
  8. 8 空山新雨后 音阙诗听 / 锦零
  9. 9 Wonderful U (Demo Version) AGA
  10. 10 广寒宫 丸子呦
  11. 11 陪我看日出 回音哥
  12. 12 春夏秋冬的你 王宇良
  13. 13 世界が终わるまでは… WANDS
  14. 14 多想在平庸的生活拥抱你 隔壁老樊
  15. 15 千禧 徐秉龙
  16. 16 我的一个道姑朋友 双笙(陈元汐)
  17. 17 大鱼 (Cover 周深) 双笙(陈元汐)
  18. 18 霜雪千年(Cover 洛天依 / 乐正绫) 双笙(陈元汐) / 封茗囧菌
  19. 19 云烟成雨(翻自 房东的猫) 周玥
  20. 20 情深深雨濛濛 杨胖雨
  21. 21 Five Hundred Miles Justin Timberlake / Carey Mulligan / Stark Sands
  22. 22 斑马斑马 房东的猫
  23. 23 See You Again Wiz Khalifa / Charlie Puth
  24. 24 Faded Alan Walker
  25. 25 Natural J.Fla
  26. 26 New Soul Vox Angeli
  27. 27 ハレハレヤ(朗朗晴天)(翻自 v flower) 猫瑾
  28. 28 像鱼 王贰浪
  29. 29 Bye Bye Bye Lovestoned
  30. 30 Blame You 眠 / Lopu$
  31. 31 Believer J.Fla
  32. 32 书信 戴羽彤
  33. 33 柴 鱼 の c a l l i n g【已售】 幸子小姐拜托了
  34. 34 夜空中最亮的星(翻自 逃跑计划) 戴羽彤
  35. 35 慢慢喜欢你 LIve版 戴羽彤
  36. 36 病变 戴羽彤
  37. 37 那女孩对我说 (完整版) Uu
  38. 38 绿色 陈雪凝
  39. 39 月牙湾 LIve版 戴羽彤
像鱼 - 王贰浪
00:00 / 04:45
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 周有才

作曲 : 周有才

这是一首简单的歌

没有什么独特

试着代入我的心事

它那么幼稚

像个顽皮的孩子

多么可笑的心事

只剩我还在坚持

谁能看透我的眼睛

让我能够不再失明

我要记住你的样子

像鱼记住水的拥抱

像云在天空中停靠

夜晚的来到

也不会忘了阳光的温暖

我要忘了你的样子

像鱼忘了海的味道

放下所有梦和烦恼

却放不下回忆的乞讨

多么可笑的心事

只剩我还在坚持

谁能看透我的眼睛

让我能够不再失明

记住你的样子

像鱼记住水的拥抱

像云在天空中停靠

夜晚的来到

也不会忘了阳光的温暖

我要忘了你的样子

像鱼忘了海的味道

放下所有梦和烦恼

却放不下回忆的乞讨

只剩自己就好