多表查询:

KEY   ====》  通过ORM引擎如何跨表: 正向查询按字段,反向查询按表名小写

模型的创建:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. class Book(models.Model):
  5. title = models.CharField(max_length=32)
  6. pub_date = models.DateField()
  7. price = models.DecimalField(max_digits=6,decimal_places=2)
  8. #publish 和book是一对多额关系
  9. publish = models.ForeignKey(to="Publish",on_delete=models.CASCADE)
  10. #book和author 表示多对多关系
  11. authors = models.ManyToManyField(to="Author",db_table="book2authors")
  12.  
  13. def __str__(self):
  14. return self.title
  15.  
  16. class Publish(models.Model):
  17. name = models.CharField(max_length=32)
  18. city = models.CharField(max_length=32)
  19. email = models.CharField(max_length=32)
  20.  
  21. def __str__(self):
  22. return self.name
  23.  
  24. class Author(models.Model):
  25. name = models.CharField(max_length=32)
  26. age = models.IntegerField()
  27. #作者与作者详细信息时一对一关系
  28. ad = models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
  29.  
  30. def __str__(self):
  31. return self.name
  32.  
  33. class AuthorDetail(models.Model):
  34. brithday = models.DateField()
  35. tel = models.BigIntegerField()
  36. addr = models.CharField(max_length=64)
  37.  
  38. def __str__(self):
  39. return str(self.tel)

一 基于对象的跨表查询( 子查询:以上一次的查询结果作为下一次的查询条件)
(1)一对多
    正向查询:按字段 book.publish
Book对象 ---------------------------------- > Publish 对象
    <---------------------------------
    反向查询:按表名小写_set.all()

(2)多对多
    正向查询:按字段 book.authors.all() 
Book对象 ---------------------------------- > Author 对象
     <---------------------------------
     反向查询:按表名小写_set.all()    ,#表名_set .all ()  此处的set表示集合的意思

(3)一对一
      正向查询:按字段 book.ad
Author 对象 ---------------------------------- > AuthorDetail 对象
      <---------------------------------
        反向查询:按表名小写

二 基于双下划綫的跨表查询:(相当于  mysql 中的   join)

left join on   

通过  表名__该表名字段=“ 条件 ”   ,       表名__     表示连表

结构:   models.Book.objects.filter(条件).values(需要查询的字段)

#多表操作======》添加def add(request):

  1. ###############################绑定一对多关系############################################################
  2. #方式一
  3. # book = models.Book.objects.create(title="python", price=123, pub_date="2019-01-02", publish_id=1)
  4. pub_obj = models.Publish.objects.filter(name="苹果出版社").first()
  5. #
  6. # book = models.Book.objects.create(title="python",price=123,pub_date="2019-01-02",publish=pub_obj)
  7. # print(book.title) #python
  8. # print(book.publish_id) #2
  9. # print(book.publish)#苹果出版社,打印对象时,__str__ 返回的值
  10. # 查询go出版社的邮箱
  11. # book_go = models.Book.objects.filter(title="go").first()
  12. # print(book_go.publish.email)
  13. #############################绑定多对多关系,无非是在关系表中创建记录######################################
  14. # linux这本书绑定两个作者:alex,egon
  15. linux = models.Book.objects.filter(title="linux").first()
  16. alex = models.Author.objects.filter(name="alex").first()
  17. egon = models.Author.objects.filter(name="egon").first()
  18. # linux.authors.add(alex.id,egon.id) #为什么不是这样写
  19. # linux.authors.add(alex,egon) #重复的作者不会添加,不知道主键时用这种方式添加
  20. # linux.authors.add(1,2) #这个也可以,已经知道主键用这种方式添加
  21. # linux.authors.add(*[2,1])#相当于打散,一个个赋值
  22. # linux.authors.remove(egon) #移除
  23. # linux.authors.clear() 解除所有绑定
  24. # linux.authors.set(1) #不能这样写
  25. # linux.authors.set([1,]) #先清空,再添加,参数必须为一个列表
  26. #
  27. # 绑定多对多的方式:一定要找到关联属性在哪里,manytomany 关联属性authors,
  28. # book.关联属性.add() book.关联属性.set([,]),book.关联属性.clear()
  29. #正向操作(关联字段所在的那个表开始)按字段,反向操作按表名小写
  30. #给Alex添加两个书
  31. linux = models.Book.objects.filter(title="linux").first()
  32. go = models.Book.objects.filter(title="go").first()
  33. alex = models.Author.objects.filter(name="alex").first()
  34. #给Alex 作者绑定两本书籍:linux和go
  35. alex.book_set.add(linux,go)
  36. return HttpResponse("添加成功!")
  37. # 一对一表的添加和一对多类似 作者表和作者详细表
  38. #多表操作========》查询
  39. def query(request):
  40. ##################################################基于对象的跨表查询############################################
  41. # (1) 一对多
  42. #1 查询linux 这本书籍的出版社的地址
        正向查询
  43. # linux = models.Book.objects.filter(title="linux").first()
  44. # print(linux.publish.city)
  45. # 2 查询苹果出版社出版的所有书籍
        反向查询
  46. # obj = models.Publish.objects.filter(name="苹果出版社").first()
  47. # query = obj.book_set.all()
  48. # print(query)
  49. # (2) 多对多
  50. # 1 查询linux书籍的所有作者
  51. # linux = models.Book.objects.filter(title="linux").first()
  52. # print(linux.authors.all())
  53. # 2查询alex作者出版过得所有书籍
  54. # alex = models.Author.objects.filter(name="alex").first()
  55. # print(alex.book_set.all())
  56. # (3)一对一
  57. # 1 查询alex的手机号
  58. # alex = models.Author.objects.filter(name="alex").first()
  59. # print(alex.ad.tel)
  60. # 2 查询手机号为911的作者的名字
  61. # obj = models.AuthorDetail.objects.filter(tel=911).first()
  62. # print(obj.authors.name)
  63. ###########################################基于双下划线的跨表查询##################################################
  64. # 1 查询linux这本书籍的出版社的地址
  65. # 方式一
  66. # queryset = models.Book.objects.filter(title="linux").values("publish__city")
  67. # print(queryset)
  68. # print(queryset[0]["publish__city"])
  69. # return HttpResponse("查询成功!")
  70. #方式二
  71. # queryset = models.Publish.objects.filter(book__title="linux").values("city")
  72. # print(queryset)
  73. # return HttpResponse("查询成功")
  74. # 2 查询linux书籍的所有作者
  75. #正向查询
  76. # queryset = models.Book.objects.filter(title="linux").values("authors__name")
  77. # print(queryset)
  78. #反向查询
  79. # queryset = models.Author.objects.filter(book__title="linux").values("name")
  80. # print(queryset)
  81. # 3 查询alex的手机号
  82. #正向查询
  83. # queryset = models.Author.objects.filter(name="alex").values("ad__tel")
  84. # print(queryset)
  85. #反向查询
  86. # queryset = models.AuthorDetail.objects.filter(author__name="alex").values('tel')
  87. # print(queryset)
  88. # 连续跨表
  89. # 4 查询人民出版社出版过的所有书籍的名字以及作者的姓名
  90. # queryset = models.Book.objects.filter(publish__name="人民出版社").values("title","authors__name")
  91. # print(queryset)
  92. # queryset = models.Author.objects.filter(book__publish__name="人民出版社").values("book__title","name")
  93. # print(queryset)
  94. # 5 手机号以119开头的作者出版过的所有书籍名称以及出版社名称
  95. queryset = models.Book.objects.filter(authors__ad__tel__startswith=119).values("title","publish__name")
  96. print(queryset)
  97. return HttpResponse("查询成功")

待续

 

55-56 ORM多表查询的更多相关文章

  1. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  2. 第十七篇 ORM跨表查询和分组查询---二次剖析

    ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...

  3. Django ORM多表查询练习

    ORM多表查询 创建表结构: from django.db import models # 创建表结构 # Create your models here. class Class_grade(mod ...

  4. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询   单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...

  5. 057.Python前端Django模型ORM多表查询

    一 基于对象的查询 1.1 一对多查询 设计路由 from django.contrib import admin from django.urls import path from app01 im ...

  6. 57 ORM多表查询

    多表查询from django.db import models# Create your models here. class Author(models.Model): nid = models. ...

  7. ORM多表查询下

    一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...

  8. django之orm单表查询

    这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...

  9. Django 模版语法 测试环境 ORM单表查询

    模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...

随机推荐

  1. linux内核中的hisi_sas是什么?

    答: 是一个HISILICON SAS 控制器驱动(HISILICON SAS controller driver)

  2. CF113D 高斯消元、dp

    题目链接 https://codeforces.com/contest/113/problem/D 思路 \(k[i]=\frac{1-p[i]}{ru[i]}\) f[i][j]表示经过i和j的次数 ...

  3. 【做题】agc002D - Stamp Rally——整体二分的技巧

    题意:给出一个无向连通图,有\(n\)个顶点,\(m\)条边.有\(q\)次询问,每次给出\(x,y,z\),最小化从\(x\)和\(y\)开始,总计访问\(z\)个顶点(一个顶点只计算一次),经过的 ...

  4. c# Database类的使用

    参考资料http://ansonlh.iteye.com/blog/1689009 搜索:c# DatabaseFactory类

  5. 【Hadoop 分布式部署 九:分布式协作框架Zookeeper架构 分布式安装部署 】

    1.首先将运行在本地上的  zookeeper 给停止掉 2.到/opt/softwares 目录下  将  zookeeper解压到  /opt/app 目录下 命令:  tar -zxvf zoo ...

  6. 【C#】Using的一个比较好的语言文字解释

    其实很早就开始使用using了.但是对这个语法糖我自己一直没有总结也没有一个很好的文字描述解释.今天看其他的博文的时候发现有人对其做了简单的解释我觉得很好,很适合一种讲解.于是抄录下来 using ( ...

  7. Intent 类型

    Intent 分为两种类型: 显式 Intent:按名称(完全限定类名)指定要启动的组件. 通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务 ...

  8. np.split()和np.array_split()

    来自:爱抠脚的coder np.split(): 该函数的参数要么按照数字划分(int),要么是按列表list划分:如果仅是输入一个int类型的数字,你的数组必须是均等的分割,否则会报错. np.ar ...

  9. c++ cmakelist 详解

    基本元素 首先cmaklist必须包括以下几个部分: #工程名 project(study_case) #cmake最低版本需求 cmake_minimum_required(VERSION 2.8. ...

  10. Array、List和ArrayList的区别(推荐: 浅显易懂)

    数组.List和ArrayList的区别(推荐: 浅显易懂)   有些知识点可能平时一直在使用,不过实际开发中我们可能只是知其然不知其所以然,所以经常的总结会对我们的提高和进步有很大的帮助,这里记录自 ...