内容概要


  • 神奇的双下划线查询
  • 外键字段的创建
  • 外键字段操作
  • 多表查询
  • 基于对象的跨表查询
  • 基于双下划线的跨表查询
  • 双下线查询扩展
  • 如何查看SQL语句

内容详情


神奇的双下划线查询

  1. 1.查询年龄大于20的用户
  2. res = models.User.objects.filter(age__gt=20)
  3. print(res)
  4. """
  5. __gt 大于
  6. __lt 小于
  7. __gte 大于等于
  8. __lte 小于等于
  9. """
  10. 2.查询年龄是182225的用户
  11. res = models.User.objects.filter(age__in=[18, 22, 25])
  12. print(res)
  13. """
  14. __in 成员运算
  15. """
  16. 3.查询年龄在1826之间的用户
  17. res = models.User.objects.filter(age__range=[18, 26]) # 包含18和26
  18. print(res)
  19. """
  20. __range 范围查询
  21. """
  22. 4.查询姓名中包含字母j的用户
  23. res = models.User.objects.filter(name__contains='j')
  24. res = models.User.objects.filter(name__icontains='j')
  25. print(res)
  26. """
  27. __contains 区分大小写
  28. __icontains 忽略大小写
  29. """
  30. # 5.其他方法补充
  31. """
  32. __startswith
  33. __endswith
  34. __regex
  35. """
  36. 6.查询月份是5月的数据
  37. res = models.User.objects.filter(op_time__month=5)
  38. print(res)
  39. 查询年份是22年的数据
  40. res = models.User.objects.filter(op_time__year=2022)
  41. print(res)
  42. """
  43. __year 按照年份筛选数据
  44. __month 按照月份筛选数据
  45. ...
  46. """

外键字段的创建

  1. """
  2. MySQL复习
  3. 关系的种类
  4. 一对多关系
  5. 多对多关系
  6. 一对一关系
  7. 关系的判断
  8. 换位思考
  9. 字段的位置
  10. 一对多关系 外键字段建在多的一方
  11. 多对多关系 外键字段建在第三张关系表中
  12. 一对一关系 外键字段建在任意一方都可以 但是推荐建在查询频率较高的表中
  13. """
  14. django orm创建表关系
  15. 图书表
  16. 出版社表
  17. 作者表
  18. 作者详情表
  19. 关系判断
  20. 书与出版社
  21. 一本书不能对应多个出版社
  22. 一个出版社可以对应多本书
  23. # 一对多关系 书是多 出版社是一 ForeignKey
  24. '''django orm外键字段针对一对多关系也是建在多的一方 '''
  25. publish = models.ForeignKey(to='Publish') # 默认关联的是主键字段
  26. 书与作者
  27. 一本书可以对应多个作者
  28. 一个作者可以对应多本书
  29. # 多对多关系 ManyToManyField
  30. '''django orm外键字段针对多对多关系 可以不用自己创建第三张表'''
  31. authors = models.ManyToManyField(to='Author') # 自动创建书与作者的第三张关系表
  32. 作者与作者详情
  33. 一个作者不能对应多个作者详情
  34. 一个作者详情不能对个多个作者
  35. # 一对一关系 OneToOneField
  36. '''django orm外键字段针对一对一关系 建在查询频率较高的表中'''
  37. author_detail = models.OneToOneField(to='AuthorDetail')
  38. ManyToManyField不会在表中创建实际的字段 而是告诉django orm自动创建第三张关系表
  39. ForeignKeyOneToOneField会在字段的后面自动添加_id后缀 如果你在定义模型类的时候自己添加了该后缀那么迁移的时候还会再次添加_id_id 所以不要自己加_id后缀
  40. ps:三个关键字里面的参数
  41. to用于指定跟哪张表有关系 自动关联主键
  42. to_field\to_fields 也可以自己指定关联字段

外键字段操作

  1. # 一对多、一对一外键字段操作

  2. publish_id=1 author_detail_id=1
  3. publish=publish_obj author_detail=detail_obj

  4. update(publish_id=3) update(author_detail_id=3)
  5. update(publish=publish_obj) update(author_detail=detail_obj)
  6. # 多对多字段操作
  7. 1.第三张关系表创建数据
  8. book_obj = models.Book.objects.filter(pk=1).first()
  9. book_obj.authors.add(1/1,2)
  10. 括号内可以放主键值也可以放数据对象 并且都支持多个
  11. author_obj1 = models.Author.objects.filter(pk=1).first()
  12. author_obj2 = models.Author.objects.filter(pk=2).first()
  13. book_obj.authors.add(author_obj1/author_obj1,author_obj2)
  14. 2.第三张关系表修改数据
  15. book_obj.authors.set([1,]/[1,2])
  16. 括号内必须是一个可迭代对象 元素同样支持主键值或者数据对象
  17. book_obj.authors.set([author_obj1,]/[author_obj1,author_obj2])
  18. 3.第三张关系表删除数据
  19. book_obj.authors.remove(1/1,2)
  20. 括号内可以放主键值也可以放数据对象 并且都支持多个
  21. 4.第三张关系表清空指定数据
  22. book_obj.authors.clear()
  23. 括号内无需传值 直接清空当前表在第三张关系表中的绑定记录

多表查询

  1. """
  2. MySQL多表查询思路
  3. 子查询
  4. 将SQL语句用括号括起来当做条件使用
  5. 连表操作
  6. inner join\left join\right join\union
  7. django orm本质还是使用的上述两种方法
  8. 子查询>>>:基于对象的跨表查询
  9. 连表操作>>>:基于双下划线的跨表查询
  10. """
  11. # 正反向的概念
  12. 核心在于当前数据对象是否含有外键字段 有则是正向 没有则是反向
  13. 正向
  14. eg:
  15. 由书籍查询出版社 外键字段在书籍表中 那么书查出版社就是'正向'
  16. 由书籍查询作者 外键字段在书籍表中 那么书查作者就是'正向'
  17. 由作者查询作者详情 外键字段在作者表中 那么也是'正向'
  18. 反向
  19. eg:
  20. 由出版社查询书籍 外键字段不在出版社表 那么出版社查书就是'反向'
  21. ...
  22. """
  23. 查询口诀
  24. 正向查询按外键字段名
  25. 反向查询按表名小写
  26. """
  27. # 编写orm跟编写SQL语句一样 不要总想着一步到位!!!

基于对象的跨表查询

  1. """基于对象的跨表查询本质就是子查询即分步操作即可"""
  2. 1.查询数据分析书籍对应的出版社
  3. 先获取书籍对象
  4. book_obj = models.Book.objects.filter(title='数据分析').first()
  5. 再使用跨表查询
  6. res = book_obj.publish
  7. print(res) # 出版社对象:北方出版社
  8. 2.查询python全栈开发对应的作者
  9. 先获取书籍对象
  10. book_obj = models.Book.objects.filter(title='python全栈开发').first()
  11. 再使用跨表查询
  12. res = book_obj.authors # app01.Author.None
  13. res = book_obj.authors.all()
  14. print(res) # <QuerySet [<Author: 作者对象:jason>, <Author: 作者对象:jerry>]>
  15. 3.查询作者jason的详情信息
  16. 先获取jason作者对象
  17. author_obj = models.Author.objects.filter(name='jason').first()
  18. 再使用跨表查询
  19. res = author_obj.author_detail
  20. print(res) # 作者详情对象:芜湖
  21. 4.查询东方出版社出版的书籍
  22. publish_obj = models.Publish.objects.filter(name='东方出版社').first()
  23. res = publish_obj.book_set # app01.Book.None
  24. res = publish_obj.book_set.all()
  25. print(res) # <QuerySet [<Book: 书籍对象:linux云计算>, <Book: 书籍对象:聊斋志异>]>
  26. 5.查询jason编写的书籍
  27. author_obj = models.Author.objects.filter(name='jason').first()
  28. res = author_obj.book_set # app01.Book.None
  29. res = author_obj.book_set.all()
  30. print(res) # <QuerySet [<Book: 书籍对象:golang高并发>, <Book: 书籍对象:python全栈开发>]>
  31. 6.查询电话是110的作者
  32. author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
  33. res = author_detail_obj.author
  34. print(res) # 作者对象:jason

基于双下划线的跨表查询

  1. """基于双下划线的跨表查询本质就是连表操作"""
  2. # 基于双下划线的跨表查询
  3. """
  4. 查询数据分析书籍对应的价格和出版日期
  5. models.Book.objects.filter(title='数据分析').values('price','publish_time')
  6. """
  7. '''手上有什么条件就先拿models点该条件对应的表名'''
  8. 1.查询数据分析书籍对应的出版社名称
  9. res = models.Book.objects.filter(title='数据分析').values('publish__name', 'publish__addr')
  10. print(res) # <QuerySet [{'publish__name': '北方出版社', 'publish__addr': '北京'}]>
  11. 2.查询python全栈开发对应的作者姓名和年龄
  12. res = models.Book.objects.filter(title='python全栈开发').values('authors__name','authors__age')
  13. print(res) # <QuerySet [{'authors__name': 'jason', 'authors__age': 18}, {'authors__name': 'jerry', 'authors__age': 29}]>
  14. 3.查询作者jason的手机号和地址
  15. res = models.Author.objects.filter(name='jason').values('author_detail__phone','author_detail__addr')
  16. print(res) # <QuerySet [{'author_detail__phone': 110, 'author_detail__addr': '芜湖'}]>
  17. 4.查询东方出版社出版的书籍名称和价格
  18. res = models.Publish.objects.filter(name='东方出版社').values('book__title','book__price')
  19. print(res) # <QuerySet [{'book__title': 'linux云计算', 'book__price': Decimal('24888.44')}, {'book__title': '聊斋志异', 'book__price': Decimal('16987.22')}]>
  20. 5.查询jason编写的书籍名称和日期
  21. res = models.Author.objects.filter(name='jason').values('book__title', 'book__publish_time')
  22. print(res) # <QuerySet [{'book__title': 'golang高并发', 'book__publish_time': datetime.date(2022, 6, 7)}, {'book__title': 'python全栈开发', 'book__publish_time': datetime.date(2022, 2, 28)}]>
  23. 6.查询电话是110的作者的姓名和年龄
  24. res = models.AuthorDetail.objects.filter(phone=110).values('author__name','author__age')
  25. print(res) # <QuerySet [{'author__name': 'jason', 'author__age': 18}]>

双下线查询扩展

  1. """基于双下划线的跨表查询的结果也可以是完整的数据对象"""
  2. '''手上有条件所在的表可以不被models点 直接点最终的目标数据对应的表'''
  3. 1.查询数据分析书籍对应的出版社名称
  4. res = models.Publish.objects.filter(book__title='数据分析')
  5. print(res) # <QuerySet [<Publish: 出版社对象:北方出版社>]>
  6. res = models.Publish.objects.filter(book__title='数据分析').values('name')
  7. print(res) # <QuerySet [{'name': '北方出版社'}]>
  8. 2.查询python全栈开发对应的作者姓名和年龄
  9. res = models.Author.objects.filter(book__title='python全栈开发').values('name','age')
  10. print(res) # <QuerySet [{'name': 'jason', 'age': 18}, {'name': 'jerry', 'age': 29}]>
  11. 3.查询作者jason的手机号和地址
  12. res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','addr')
  13. print(res) # <QuerySet [{'phone': 110, 'addr': '芜湖'}]>
  14. 4.查询东方出版社出版的书籍名称和价格
  15. res = models.Book.objects.filter(publish__name='东方出版社').values('title','price')
  16. print(res) # <QuerySet [{'title': 'linux云计算', 'price': Decimal('24888.44')}, {'title': '聊斋志异', 'price': Decimal('16987.22')}]>
  17. 5.查询jason编写的书籍名称和日期
  18. res = models.Book.objects.filter(authors__name='jason').values('title','publish_time')
  19. print(res) # <QuerySet [{'title': 'golang高并发', 'publish_time': datetime.date(2022, 6, 7)}, {'title': 'python全栈开发', 'publish_time': datetime.date(2022, 2, 28)}]>
  20. 6.查询电话是110的作者的姓名和年龄
  21. res = models.Author.objects.filter(author_detail__phone=110).values('name','age')
  22. print(res) # <QuerySet [{'name': 'jason', 'age': 18}]>
  23. # 连续跨表操作
  24. 查询python全栈开发对应的作者的手机号
  25. res = models.Book.objects.filter(title='python全栈开发').values('authors__author_detail__phone')
  26. print(res) # <QuerySet [{'authors__author_detail__phone': 110}, {'authors__author_detail__phone': 140}]>
  27. res1 = models.AuthorDetail.objects.filter(author__book__title='python全栈开发').values('phone')
  28. print(res1) # <QuerySet [{'phone': 110}, {'phone': 140}]>
  29. """
  30. 可能出现的不是疑问的疑问:如何获取多张表里面的字段数据
  31. res = models.Book.objects.filter(title='python全栈开发').values('authors__author_detail__phone','authors__name','title')
  32. print(res)
  33. """

如何查看SQL语句

  1. 方式1:如果结果集对象是queryset 那么可以直接点query查看
  2. 方式2:配置文件固定配置
  3. 适用面更广 只要执行了orm操作 都会打印内部SQL语句
  4. LOGGING = {
  5. 'version': 1,
  6. 'disable_existing_loggers': False,
  7. 'handlers': {
  8. 'console':{
  9. 'level':'DEBUG',
  10. 'class':'logging.StreamHandler',
  11. },
  12. },
  13. 'loggers': {
  14. 'django.db.backends': {
  15. 'handlers': ['console'],
  16. 'propagate': True,
  17. 'level':'DEBUG',
  18. },
  19. }
  20. }

django框架6的更多相关文章

  1. MVC其实很简单(Django框架)

    Django框架MVC其实很简单 让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同. 下面就是通过使用Django来完成以上功能的例子: 首先,我们 ...

  2. Django框架-目录文件简介

    Rhel6.5 Django1.10 Python3.5 Django框架-目录文件简介 1.介绍Django Django:一个可以使Web开发工作愉快并且高效的Web开发框架. 使用Django, ...

  3. Django框架学习

    两个月前学习的Django框架,写了个简易婚恋调查网站,代码就懒得全贴了,有两张图记录下

  4. django框架的models

    在django的框架设计中采用了mtv模型,即Model,template,viewer Model相对于传统的三层或者mvc框架来说就相当对数据处理层,它主要负责与数据的交互,在使用django框架 ...

  5. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

  6. MySQL在Django框架下的基本操作(MySQL在Linux下配置)

    [原]本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作,核心内容如下: ------------------------------------------------------ ...

  7. django框架介绍

    主要内容 1.        Django框架发展 2.        Django架构,MTV模式 3.        开发流程 4.        开发实例——Poll python下各种框架 一 ...

  8. Django学习(二) Django框架简单搭建

    为了快速学习Python进行Web的开发,所以我不准备从Python的基础学起,直接从Django框架入手,边学框架边学Python的基础知识. 下面就开始Django的快速开发之旅吧. 关于Djan ...

  9. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

  10. Django框架全面讲解

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

随机推荐

  1. 【每日日报】第三十八天---java与时间相关

    1 今天看了网上的课程 学习了java的关于时间的代码 获取时间 import java.util.Date; public class DateDemo { public static void m ...

  2. mysql 合并查询结果

     UNION 使用 UNION 关键字是,数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录:   UNION ALL 使用 UNION ALL,不会去除掉系统的记录:

  3. ABP源码分析 - 约定注册(3)

    入口 //ConfigureServices foreach (var module in Modules) { if (module.Instance is AbpModule abpModule) ...

  4. Python入门-异常处理

    异常处理 #try----else---- 会一起执行 #finally无论如何,最后都会执行 def main(): try: res = 10/2 print("开始执行计算:" ...

  5. python---复杂度、斐波那切数列、汉诺塔

    时间复杂度 ​ 用来估计算法运行时间的一个式子. ​ 一般来说, 时间复杂度高的算法比复杂度低的算法慢. 常见的时间复杂度: ​ O(1) < O(logn) < O(n) < O( ...

  6. Spring集成web环境(使用封装好的工具)

    接上文spring集成web环境(手动实现) ##########代码接上文############# spring提供了一个监听器ContextLoaderListener对上述功能的封装,该监听器 ...

  7. linux压缩打包、定时任务

    压缩打包 gzip压缩 win中的压缩包:zip rar Linux常见的压缩包有哪些? gzip bzip2 1.gzip压缩 压缩命令:gzip [压缩文件] 解压命令:gzip -d [压缩包] ...

  8. js如何判断一个对象是不是Array? 三种方法总有一种可以帮上忙

    转载:http://www.nowamagic.net/librarys/veda/detail/1250 在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢? ...

  9. 11.Flink实时项目之支付宽表

    支付宽表 支付宽表的目的,最主要的原因是支付表没有到订单明细,支付金额没有细分到商品上, 没有办法统计商品级的支付状况. 所以本次宽表的核心就是要把支付表的信息与订单明细关联上. 解决方案有两个 一个 ...

  10. 关于在PyCharm中import numpy 出现from . import _mklinit ImportError: DLL load failed: 找不到指定模块

    最近因为一些原因安装了Anaconda3并且重新配置Python环境,但是遇到了一些麻烦的事情. 首先就是在Anaconda已经装好numpy和mkl的情况下,在PyCharm中import nump ...