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学习笔记--数据库中的多表操作的更多相关文章

  1. Django学习笔记--数据库中的单表操作----增删改查

    1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...

  2. Django学习笔记(7)——单表操作和多表操作

    单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...

  3. Django学习笔记(6)——Form表单

    知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...

  4. Oracle学习笔记—数据库,实例,表空间,用户、表之间的关系

    之前一直使用的关系型数据库是Mysql,而新公司使用Oracle,所以最近从网上搜集了一些资料,整理到这里,如果有不对的地方,欢迎大家讨论. 基本概念: 数据库:Oracle 数据库是数据的物理存储. ...

  5. Django 学习 之ORM简介与单表操作

    一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...

  6. 【JAVAEE学习笔记】hibernate03:多表操作详解、级联、关系维护和练习:添加联系人

    一.一对多|多对一 1.关系表达 表中的表达 实体中的表达 orm元数据中表达 一对多 <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 co ...

  7. Django学习笔记(14)——AJAX与Form组件知识补充(局部钩子和全局钩子详解)

    我在之前做了一个关于AJAX和form组件的笔记,可以参考:Django学习笔记(8)——前后台数据交互实战(AJAX):Django学习笔记(6)——Form表单 我觉得自己在写Django笔记(8 ...

  8. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  9. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

随机推荐

  1. Django的使用一

    Django是一个由Python写成的Web应用框架,是 Python 社区的两大最受欢迎的 Web 框架之一(另一个是 Flask). Django的主要目的是简便.快速的开发数据库驱动的网站. 1 ...

  2. 第四周作业—N42-虚怀若谷

    一.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 [root@centos7 ~]# grep -v "/sbin/nolo ...

  3. 【Nacos】Nacos安装

    1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云本机应用程序和微服务平台. Nacos基本上支持现在所有类型的服务, ...

  4. PerPoly Collision(用物体本身模型做碰撞)

    打开static mesh editor,在static mesh settings里找到collision complexity选项,选择最后一项: Use Complex collision as ...

  5. 攻防世界 | guess_num

    查源码发现v5可以覆盖sreed[0],这样这个随机数列就可控了 在随机种子这里我一开始使用devC++来生成,居然结果跟gcc的不一样

  6. [CSP-S模拟测试]:太阳神(莫比乌斯反演)

    题目描述 太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目.求满足如下条件的数对$(a,b)$对数:$a,b$均为正整数且$a,b\leqslant n$而$lcm(a,b)>n ...

  7. php str_replace与substr_replace的区别

    函数定义: str_replace() :函数替换字符串中的一些字符(区分大小写). substr_replace() :函数把字符串的一部分替换为另一个字符串. 区别: str_replace()和 ...

  8. 移动端rem布局屏幕适配插件(放js中便可使用)

    /* doc:不用管:document对象 win:不用管:window对象 design:注意:设计稿的尺寸/物理像素*/ (function (doc, win,design) {// alert ...

  9. MySql使用mysqldump 导入与导出方法总结

    导出数据库数据:首先打开cmd进入MySQL的bin文件夹下 1.导出education数据库里面的users表的表数据和表结构(下面以users表为例) mysqldump -u[用户名] -h[i ...

  10. Keras 层layers总结

    https://blog.csdn.net/u010159842/article/details/78983841