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)

转载于:https://www.cnblogs.com/zj901203/p/10967836.html

django学习笔记--数据库中的多表操作相关推荐

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

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

  2. .NET学习笔记:文件和注册表操作

    数据流:所有流式类的(抽象)基类都是System.IO命名空间下的Stream类.Stream类允许通过文件.网络.套接字流动数据.我们可以使加密的数据流动,也可以使数据流缓冲处理. 通过缓冲流动数据 ...

  3. 用ajax做级联操作,学习笔记之MVC级联及Ajax操作

    由于刚转型到MVC,MVC的架构模式很多不是很清楚,比如今天就想做个级联的操作,因为之前的ASP.NET的方式是通过:控件-->添加事件-->后台编写级联事件进行触发,但是这个MVC就不同 ...

  4. Mysql数据库学习笔记(1.创建数据表)ubuntu18.04

    *创建数据表 用户名:root  密码: 连接数据库:mysql -u root -p 退出数据库:quit; exit; ctrl+D *远程连接 mysql -hip地址 -uroot -p -h ...

  5. django 学习笔记

    django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...

  6. django学习笔记02

    原创博客地址:django学习笔记02 第一章:模型层 1.8 查询操作 一.创建对象 1 2 3 4 5 >>> from blog.models import Blog > ...

  7. django学习笔记01

    原创博客地址:django学习笔记01 基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87 第一章:模型层 1.1 模 ...

  8. 千锋Django学习笔记

    千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...

  9. oracle 表导出pdm文件,如何将数据库中已有表导入到powerDesigner生成pdm文件

    1.create new PDM: 2.select database menu; 3.click Reverse  Engineer database : 4.then choose your sc ...

最新文章

  1. PL/SQL常用方法汇总
  2. LNMP下目录访问验证
  3. (22)通过代码修改PTE实现挂物理页
  4. [SpringBoot2]welcomefavicon
  5. Ionic混合移动app框架学习
  6. 红橙Darren视频笔记 缓存方案 缓存到数据库(数据库操作) 上
  7. 怎么用Excel来批量生成SQL语句
  8. ESTORE OPENCART 清爽现代主题模板 ABC-0063
  9. jQuery源码解析(30)
  10. 小票打印机安装配置全过程 58mm热敏票据打印机驱动安装
  11. PADS(4)——PADS Logic原理图设计技巧
  12. 高德地图自定义定位当前位置按钮
  13. linux光盘属于什么设备,Linux系统中,光盘的设备文件为
  14. 手机就能申请摇号 杭州市小客车摇号功能全新上线
  15. C#获取北京时间多种方法
  16. 阿里云Oss水印图片处理Utils
  17. 2022-09-12 mysql语法分析实现
  18. 开启ICT宝藏之门——CloudOpera IES 创新社区正式成立
  19. 广告主流量主怎么申请(微信)
  20. 【ct107d】开发版说明书

热门文章

  1. spring 测试类test测试方法
  2. 数据结构之跳表Skiplist
  3. HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)
  4. VBScript中InStr函数的用法
  5. hdu 4263(有限制的生成树)
  6. 社会生活中常用的14条著名法则
  7. vlookup示例_VLOOKUP示例–如何在Excel中执行VLOOKUP
  8. uber_Uber是如何制成的
  9. php类方法语法错误捕获,php语法错误捕获
  10. 验证(verification)和确认(validation)