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 ...
随机推荐
- GPS通讯 数据包解析
全球时区的划分: 每个时区跨15°经度.以0°经线为界向东向西各划出7.5°经度,作为0时区.即0时区的经度范围是7.5°W——7.5°E.从7.5°E与7.5°W分别向东.向西每15°经度划分为一个 ...
- Eclipse 4.9 创建springboot项目步骤
上一篇文章写了eclipse安装STS. 现在创建Spring Starter Project 具体步骤如下: 1.等你安装好STS后,就在Eclipse > File >New 选择 ...
- 2019ICPC上海网络赛A 边分治+线段树
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 解法:边分治+线段树 首先我们将所有的点修改和边修改都存在对应的边里面. 然后 ...
- Not a Number (NaN)
NaN can be produced by: 1. 0/0 2. Inf - Inf 3. Inf/Inf 4. 0*Inf 5. rem(x,y), where y=0 or x=Inf
- python内置装饰器
前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...
- CentOS 7.3 安装MySQL 5.7并修改初始密码
在CentOS 7.3 下安装MySQL 5.7并修改初始密码,Windows下安装MySQL 5.7 见 http://www.linuxidc.com/Linux/2017-11/148521.h ...
- symfony 初始化项目
学习Symfony首先看一下已经发布了哪些版本; 现在我记录一下两个版本的使用情况: 3.4 是一个长期维护且稳定的版本 4.3是一个最新版本且速度飞快地版本 官方介绍:https://symfony ...
- nmon分析工具的使用
linux监控服务器资源 1.下载nmon_linux_more_14g.tar.gz,下载完成解压之后,我们先命令行看看自己Linux的版本,和nmon支持一下Linux发行版本 2.mkdir / ...
- 鸟哥私房菜学习——centos 7_安装
下面是我安装时遇到问题后搜索找到的可行办法: 准备工具: 8G左右U盘; 最新版UltraISO; CentOS7光盘镜像; CentOS7的镜像文件,可以在网易的开源镜像站或者阿里云的开源镜像站下载 ...
- 自动发现项目中的url
def check_url_exclude(url): """ 判断url是否需要自动被发现,如果不是则移除 :param url: 自动发现的url :return: ...