django学习笔记--数据库中的多表操作
1.Django数据库----多表的新增操作
1.一对一模式下新增
创建一个详情对象,把这个对象赋值给创建的新的user对象
author_detail = models.AuthorDetail.objects.create(addr='上海',phone='178****4789')
# 直接设置author_detail为一个对象
author = models.Author.objects.create(name="zhangsan",age=32,author_detail=author_detail)
# 直接设置author_detail_id,或者直接设置她的主键为对应的id,author_detail.pk
author = models.Author.objects.create(name="李四",age=40,author_detail_id=author_detail.pk)
1.1.删除和修改,直接修改更新
author = models.Author.objects.filter(pk=1).update(author_detail_id=3)
2.一对多的添加
publish = models.Publish.objects.create(name='上海出版社',addr='上海东方明珠',phone='138****9087',email='***080977**@qq.com')
book = models.Book.objects.create(name='红楼梦',price=120.00,publish_date='2018-09-10',publish=publish)
3.多对多关系
# 给书添加两个作者
book = models.Book.objects.filter(name='红楼梦').first()
# 拿到数据模型,add可以传对象也可以传id
book.authors.add(1,3)
# 删除书的两个作者
# clear 移除所有的作者
book.authors.clear()
# remove 移除一个对象,可以传对象或者id
book.authors.remove(3)
# 修改对象
# 第一种方式 全部删除,在重新添加
# 第二种方式 set 参数必须是列表,列表内可以传id或者对象
book.authors.set([7,1])
4.基于对象的跨表查询
4.1 跨表查询分为正向和反向,
1.正向---> 关联字段在当前表中,从当前表向外查,叫正向
2.反向---> 关联字段不在当前表中,从当前表向外查,叫反向
4.2 一对一查询,正向查询按字段,反向查询按表名小写
1.正向查询按字段
2.反向查询按表名小写
#正向 ,查询name为张三的人的居住地址
author = models.Author.objects.filter(name='张三').first()
print(author.author_detail.addr)
#反向 查询居住地址为上海的人的名称
author_detail = models.AuthorDetail.objects.filter(addr="上海").first()
print(author_detail.author.name)
# 查询红楼梦的出版社地址
book = models.Book.objects.filter(name='红楼梦').first()
print(book.publish.addr)
4.3 一对多查询
1.正向查询按字段
2.反向查询按表名小写_set
#北京出版社出版的所有书籍
publish = model.Publish.objects.filter(name='北京出版社').first()
#books获取到的是一个querySet对象
books = publish.book_set.all()
#查询红楼梦的所有作者
book = models.Book.objects.filter(name='红楼梦').first()
authors = book.authors.all()
4.4 多对多查询
1.正向查询按字段
2.反向查询按表名小写_set
#查询张三所写的所有书
author = models.Author.objects.filter(name='张三').first()
print(author.book.set.all()).first())
5.基于对象的跨表查询是子查询,基于双下划线的查询是连表查询
正向按字段 反向按表名小写,跨表查询,通过一张表获取多个表对应的数据
#一对一查询 跨表查询
#查询张三的个人地址
addr = models.Author.objects.filter(name='张三').values('name','author_detail__addr').first()
res = models.AuthorDetail.objects.filter(author__name="张三").values('addr',author__name)
#查询地址为上海的人的名字 反向查询
res = models.Author.objects.filter(author_detail__addr='上海').values('name','author_detail_addr').first()
#正向查询
res = models.AuthorDetail.objects.filter(addr='上海').values('addr','author__name').first()
# 一对多查询
# 查询红楼梦的出版地址
res = models.Publish.objects.filter(book__name='红楼梦').values('name','book__name').first()
#查询北京出版社出版的书
res = models.Book.objects.filter(publish__name='北京出版社').values('name','publish__name').first()
# 多对多查询
# 跨表查询,Publish Book Authors 三张表查询
# 查询北京出版社出版过的所有书籍的名字以及作者的名字
# book__ 在book这个表中book__authors在authors表中
# res = models.Publish.objects.filter(name="北京出版社").values("book__name",'book__authors__name').first()
# print(res)
# res = models.Book.objects.filter(publish__name="北京出版社").values('name','authors__name').first()
# print(res)
# res = models.Author.objects.filter(book__publish__name="北京出版社").values('name','book__name')
# print(res)
6.F和Q 聚合查询和分组查询
引入对应的模块,aggregate聚合函数
# from django.db.models import Count,Avg,Max,Min,Sum
# 获取图书价格的各种信息
# ret = models.Book.objects.all().aggregate(Avg('price'))
# ret = models.Book.objects.all().aggregate(Max('price'))
# ret = models.Book.objects.all().aggregate(Min('price'))
# ret = models.Book.objects.all().aggregate(Count('price'))
# ret = models.Book.objects.all().aggregate(Sum('price'))
6.1 F和Q查询
1.F取出表中字段对应的值
2.Q查询的时候构成与或非的关系
在book里面添加评论数和阅读数
# from django.db.models import F,Q
# 查询评论数大于阅读数的书
res = models.Book.objects.filter(commit_num__lt=F('read_num'))
# 所有评论数加1
ret = models.Book.objects.all().update(commit_num=F("commit_num")+1)
# Q构造查询关系
# 查询名字为红楼梦的书并且价格为20的书
ret = models.Book.objects.filter(name='红楼梦',price=20)
ret = models.Book.objects.filter(Q(name='红楼梦')&Q(price=20))
# 查询名字为红楼梦的书或价格为20的书
ret = models.Book.objects.filter(Q(name='红楼梦')|Q(price=20))
# 查询名字不等于红楼梦 取非
ret = models.Book.objects.filter(~Q(name='红楼梦'),price=20.0)
django学习笔记--数据库中的多表操作的更多相关文章
- Django学习笔记--数据库中的单表操作----增删改查
1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...
- Django学习笔记(7)——单表操作和多表操作
单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...
- Django学习笔记(6)——Form表单
知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...
- Oracle学习笔记—数据库,实例,表空间,用户、表之间的关系
之前一直使用的关系型数据库是Mysql,而新公司使用Oracle,所以最近从网上搜集了一些资料,整理到这里,如果有不对的地方,欢迎大家讨论. 基本概念: 数据库:Oracle 数据库是数据的物理存储. ...
- Django 学习 之ORM简介与单表操作
一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...
- 【JAVAEE学习笔记】hibernate03:多表操作详解、级联、关系维护和练习:添加联系人
一.一对多|多对一 1.关系表达 表中的表达 实体中的表达 orm元数据中表达 一对多 <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 co ...
- Django学习笔记(14)——AJAX与Form组件知识补充(局部钩子和全局钩子详解)
我在之前做了一个关于AJAX和form组件的笔记,可以参考:Django学习笔记(8)——前后台数据交互实战(AJAX):Django学习笔记(6)——Form表单 我觉得自己在写Django笔记(8 ...
- Django 学习笔记之三 数据库输入数据
假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...
- Django学习笔记(五)—— 表单
疯狂的暑假学习之 Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path ...
随机推荐
- 类数组对象与 arguments
类数组对象:拥有一个 length 属性和若干索引属性的对象 var array = ['name', 'age', 'sex']; var arrayLike = { 0: 'name', 1: ' ...
- Spark在MaxCompute的运行方式
一.Spark系统概述 左侧是原生Spark的架构图,右边Spark on MaxCompute运行在阿里云自研的Cupid的平台之上,该平台可以原生支持开源社区Yarn所支持的计算框架,如Spark ...
- python内建模块——collections模块
在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...
- 如何安全修改cocoapods上的第三方代码
其实搞java的都知道maven管理,解决第三方代码修改的办法就是架一个服务器,把这些修改的库放在这里,然后再maven里配置哪些需要用本地仓库的.其实cocoapods也可以做本地包管理: 大致方法 ...
- php二维数组对某一列进行数据组装
demo示例: $data = array( '0' => array('id' => 10, 'username' => '陈一'), '1' => array('id' = ...
- JS对象、原型、this学习总结
1.对象是函数创建的,而函数却又是一种对象.(属性的集合) 2.每个函数都有一个属性叫做prototype.这个prototype的属性值是一个对象,默认的只有一个constructor的属性,指向这 ...
- Ubuntu查看端口使用情况,使用netstat命令:
https://www.cnblogs.com/fly-book/p/9827128.html
- 本站页脚HTML回顶部代码
<style type="text/css">.top { width: 50px; height: 50px; background-color: #F0F0F0; ...
- ALDS1_1_3_D Areas on the Cross-Section Diagram 遇见了几个有意思的语法问题
Your task is to simulate a flood damage. For a given cross-section diagram, reports areas of flooded ...
- Spring MVC浅析
讲到MVC,想必大家都很熟悉,就是将数据模型.视图.控制器进行分离,做到分工明确,在Spring的帮助下,Spring MVC 更是做到了充分的解耦,因为大部分的资源都由Spring进行管理,为Spr ...