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()) |
神奇的双下划线查询
| ''' |
| 只要还是queryset对象就可以无限制的点queryset对象的方法 |
| |
| queryset.filter().values().filter().values_list().filter()... |
| ''' |
| |
| res = models.User.objects.filter(age__gt=18) |
| |
| res = models.User.objects.filter(age__lt=38) |
| |
| res = models.User.objects.filter(age__gte=18) |
| res = models.USer.objects.filter(age__lte=38) |
| |
| res = models.User.objects.filter(age__in=(18,28,38)) |
| |
| |
| res = models.User.objects.filter(age__range=(18,38)) |
| |
| |
| res = models.User.objects.filter(name__contains='j') |
| res = models.User.objects.filter(name__icontains='j') |
| |
| |
| res = models.User.objects.filter(register_time__year=2022) |
| |
| '''针对django框架的时区问题 是需要配置文件中修改的后续bbs再说''' |
ORM外键字段的创建
| ''' |
| 复习MySQL外键关系 |
| 一对多 |
| 外键字段建在多的一方 |
| 多对多 |
| 外键字段统一建在第三张关系表 |
| 一对一 |
| 建在任何一方都可以 但是建议在查询频率较高的表中 |
| ''' |
| ps: 关系的判断可以采用换位思考原则 熟练之后可以瞬间判断 |
| |
| 1.创建基础表(书籍表、出版社表、作者表、作者详情) |
| 2.确定外键关系 |
| 一对多 ORM与MySQL一致 外键字段建在多的一方 |
| 多对多 ORM与MySQL有很多变化 |
| 1. 外键字段可以直接建在某张表中(查询频率比较高的) |
| 内部会自动帮你创建第三章关系表 |
| 2.自己创建第三章关系表并创建外键字段 |
| |
| 一对一 ORM与MySQL一致 外键字段建在查询较高的一方 |
| |
| 3.ORM的创建 |
| 针对一对多和一对一同步到表中之后会自动加_id的后缀 |
| publish = models.ForeignKey(to='Publish',on_delete=models.CASADE) |
| author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE) |
| 针对多对多 不会在表中有展示 而是创建第三章表 |
| author = models.ManyToManyField(to='Author') |
| |
外键字段相关操作
| |
| models.Book.objects.create(title='遮天',price=888.88,publish_id=1) |
| models.Book.objects.create(title='完美世界',price=999.99,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.author.add(1) |
| book_obj,author.add(2,3) |
| book_obj = models.Book.objects.filter(pk=4).first() |
| author_obj1 = models.Book.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.author.remove(2) |
| book_obj.authors.remove(1,3) |
| book_obj.authors.remove(author_obj1,) |
| |
| book_obj.authors.remove(author_obj1,author_obj2) |
| |
| book_obj.author.clear() |
| |
| add()\remove() 多个位置参数(数字 对象) |
| set() 可迭代对象(元组 列表) 数字 对象 |
| clear() 情况当前数据对象的关系 |
ORM跨表查询
| """ |
| 复习MySQL跨表查询的思路 |
| 子查询 |
| 分布操作: 将一条SQL语句用括号括起来当作另外一条SQL语句的条件 |
| 连表操作 |
| 先整合多张表之后基于单表查询即可 |
| inner join 内连接 |
| left join 左连接 |
| right join 右连接 |
| """ |
| 正反向查询的概念(重要) |
| 正向查询 |
| 由外键字段所在的表数据查询关联的表数据 正向 |
| 反向查询 |
| 没有外键字段的表数据查询关联的表数据 反向 |
| ps:正反向的核心就是看外键字段在不在当前数据所在的表中 |
| |
| |
| ORM跨表查询的口诀(重要) |
| 正向查询按外键字段 |
| 反向查询按表名小写 |
基于对象的跨表查询
| 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) |
| 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) |
| |
| |
| 4. 查询北方出版社出版过的书籍 |
| publish_obj = models.Publish.objects.filter(name='北方出版社').first() |
| print(publish_obj.book_set) |
| print(publish_obj.book_set.all()) |
| |
| |
| 5. 查询jason写过的书籍 |
| author_obj = models.Author.objects.filter(name='jason').first() |
| print(author_obj.book_set) |
| 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) |
基于上下划线的跨表查询
| '''基于双下划线的跨表查询''' |
| 1. 查询主键为1的书籍对应的出版社名称 |
| res = models.Book.objects.filter(pk=1).values('publish__name','title') |
| |
| 2. 查询主键为4的书籍对应的作者姓名 |
| res = models.Book.objects.filter(pk=4).values('title','authors__name') |
| |
| 3.查询jason的电话号码 |
| res = models.Author.objects.filter(name='jason').values('author_detail__phone') |
| |
| |
| 4.查询北方出版社出版过的书籍名称和价格 |
| res = models.Publish.objects.filter(name='北方出版社').values('book__title','book__prince','name') |
| |
| |
| 5. 查询jason写过的书籍名称 |
| res = models.Author.objects.filter(name='jason').values('book__title','name') |
| |
| |
| 6.查询电话号码是110的作者姓名 |
| res = models.AuthorDetail.objects.filter(phone=110).values('phone','author__name') |
进阶操作
| 1.查询主键为1的书籍对应的出版社名称 |
| res = models.Publish.objects.filter(book__pk=1).values('name') |
| |
| 2.查询主键为4的书籍对应的作者姓名 |
| res = models.Author.objects.filter(book__pk=4).values('name','book__title') |
| |
| 3. 查询jason的电话号码 |
| res = models.AuthorDetail.objects.filter(author__name='jason').values('phone') |
| |
| 4.查询北方出版社出版过的书籍名称和价格 |
| res = models.Book.objects.filter(publish__name='北方出版社').values('title','price') |
| |
| 5.查询jason写过的书籍名称 |
| res = models.Book.objects.filter(authors__name='jason').values('title') |
| |
| |
| 6.查询电话号码是110的作者姓名 |
| res = models.Author.objects.filter(author_detail__phone=110).values('name') |
| print(res) |
| |
| |
| """ |
| 补充 |
| # 查询主键为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) |
| """ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构