多表查询:

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

模型的创建:

from django.db import models

# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
pub_date = models.DateField()
price = models.DecimalField(max_digits=6,decimal_places=2)
#publish 和book是一对多额关系
publish = models.ForeignKey(to="Publish",on_delete=models.CASCADE)
#book和author 表示多对多关系
authors = models.ManyToManyField(to="Author",db_table="book2authors") def __str__(self):
return self.title class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.CharField(max_length=32) def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
#作者与作者详细信息时一对一关系
ad = models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) def __str__(self):
return self.name class AuthorDetail(models.Model):
brithday = models.DateField()
tel = models.BigIntegerField()
addr = models.CharField(max_length=64) def __str__(self):
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):

###############################绑定一对多关系############################################################
#方式一
# book = models.Book.objects.create(title="python", price=123, pub_date="2019-01-02", publish_id=1)
pub_obj = models.Publish.objects.filter(name="苹果出版社").first()
#
# book = models.Book.objects.create(title="python",price=123,pub_date="2019-01-02",publish=pub_obj)
# print(book.title) #python
# print(book.publish_id) #2
# print(book.publish)#苹果出版社,打印对象时,__str__ 返回的值 # 查询go出版社的邮箱
# book_go = models.Book.objects.filter(title="go").first()
# print(book_go.publish.email)
#############################绑定多对多关系,无非是在关系表中创建记录###################################### # linux这本书绑定两个作者:alex,egon
linux = models.Book.objects.filter(title="linux").first()
alex = models.Author.objects.filter(name="alex").first()
egon = models.Author.objects.filter(name="egon").first()
# linux.authors.add(alex.id,egon.id) #为什么不是这样写
# linux.authors.add(alex,egon) #重复的作者不会添加,不知道主键时用这种方式添加
# linux.authors.add(1,2) #这个也可以,已经知道主键用这种方式添加
# linux.authors.add(*[2,1])#相当于打散,一个个赋值
# linux.authors.remove(egon) #移除
# linux.authors.clear() 解除所有绑定
# linux.authors.set(1) #不能这样写
# linux.authors.set([1,]) #先清空,再添加,参数必须为一个列表
#
# 绑定多对多的方式:一定要找到关联属性在哪里,manytomany 关联属性authors,
# book.关联属性.add() book.关联属性.set([,]),book.关联属性.clear() #正向操作(关联字段所在的那个表开始)按字段,反向操作按表名小写
#给Alex添加两个书
linux = models.Book.objects.filter(title="linux").first()
go = models.Book.objects.filter(title="go").first()
alex = models.Author.objects.filter(name="alex").first()
#给Alex 作者绑定两本书籍:linux和go
alex.book_set.add(linux,go) return HttpResponse("添加成功!") # 一对一表的添加和一对多类似 作者表和作者详细表 #多表操作========》查询 def query(request):
##################################################基于对象的跨表查询############################################
# (1) 一对多
#1 查询linux 这本书籍的出版社的地址
    正向查询
# linux = models.Book.objects.filter(title="linux").first()
# print(linux.publish.city)
# 2 查询苹果出版社出版的所有书籍
    反向查询
# obj = models.Publish.objects.filter(name="苹果出版社").first()
# query = obj.book_set.all()
# print(query)
# (2) 多对多
# 1 查询linux书籍的所有作者
# linux = models.Book.objects.filter(title="linux").first()
# print(linux.authors.all()) # 2查询alex作者出版过得所有书籍
# alex = models.Author.objects.filter(name="alex").first()
# print(alex.book_set.all()) # (3)一对一
# 1 查询alex的手机号
# alex = models.Author.objects.filter(name="alex").first()
# print(alex.ad.tel)
# 2 查询手机号为911的作者的名字
# obj = models.AuthorDetail.objects.filter(tel=911).first()
# print(obj.authors.name) ###########################################基于双下划线的跨表查询##################################################
# 1 查询linux这本书籍的出版社的地址
# 方式一
# queryset = models.Book.objects.filter(title="linux").values("publish__city")
# print(queryset)
# print(queryset[0]["publish__city"])
# return HttpResponse("查询成功!")
#方式二
# queryset = models.Publish.objects.filter(book__title="linux").values("city")
# print(queryset)
# return HttpResponse("查询成功") # 2 查询linux书籍的所有作者
#正向查询
# queryset = models.Book.objects.filter(title="linux").values("authors__name")
# print(queryset)
#反向查询
# queryset = models.Author.objects.filter(book__title="linux").values("name")
# print(queryset)
# 3 查询alex的手机号
#正向查询
# queryset = models.Author.objects.filter(name="alex").values("ad__tel")
# print(queryset)
#反向查询
# queryset = models.AuthorDetail.objects.filter(author__name="alex").values('tel')
# print(queryset) # 连续跨表
# 4 查询人民出版社出版过的所有书籍的名字以及作者的姓名
# queryset = models.Book.objects.filter(publish__name="人民出版社").values("title","authors__name")
# print(queryset)
# queryset = models.Author.objects.filter(book__publish__name="人民出版社").values("book__title","name")
# print(queryset)
# 5 手机号以119开头的作者出版过的所有书籍名称以及出版社名称
queryset = models.Book.objects.filter(authors__ad__tel__startswith=119).values("title","publish__name")
print(queryset) 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. Vue学习【第六篇】:Vue-cli脚手架(框架)与实战案例

    环境搭建 安装node 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ 安装cnpm npm install -g cnpm --registry=https://re ...

  2. 终于明白vim 和 grep 中 的正则表达式的用法, vim 正则表达式 和grep基本正则表达式 几乎一样

    要搞清楚 vim中的正则和普通的Perl正则表达式的区别: 因为在perl中所有的元字符 都可以直接使用, 不需要在 元字符的前面加 反斜杠. 但是在vim, 包括grep中就有所区别, 同样是元字符 ...

  3. 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统

    参考: http://blog.csdn.net/statdm/article/details/7756788 参考: http://www.cnblogs.com/fengbohello/p/488 ...

  4. rocketmq总结(消息的顺序、重复、事务、消费模式)

    rocketmq总结(消息的顺序.重复.事务.消费模式) 参考: http://www.cnblogs.com/wxd0108/p/6038543.html https://www.cnblogs.c ...

  5. 【特性】MySQL 8 新特性

    MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...

  6. 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)

    题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...

  7. An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

    An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling 2018-0 ...

  8. 20165306 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验要求 1.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号.本提交点考查JUnit会不会使用,测试 ...

  9. JAVA中char和String/值类型和引用类型的区别

    import java.util.*; class test { public static void main(String[] args) { char a[] = {'b', 'a', 'c'} ...

  10. R语言学习 - 非参数法生存分析--转载

    生存分析指根据试验或调查得到的数据对生物或人的生存时间进行分析和推断,研究生存时间和结局与众多影响因素间关系及其程度大小的方法,也称生存率分析或存活率分析.常用于肿瘤等疾病的标志物筛选.疗效及预后的考 ...