django多对多表的创建,级联删除及手动创建第三张表


Posted in Python onJuly 25, 2019

创建一张作者表,author,创建外键与book表,多对多关系 ,外键字段放在那张表都可以,

class Author(models.Model):

  name = models.CharField(max_length=32)

  #在Author表中创建第三张表,与book表创建多对多关系一样的效果

  # books = models.ManyToManyField(Book)

  #再重新生成数据库,因为新增了多对多关系,book表会新增字段,所以直接重新生成数据库就会报错,

在book表里,关联Author表,Author就要放在book表上面,

关联的表Author加上引号是字符串,是一个查询过程,等加载完,找Author,

就可以在全局找到,

不加引号,就要把Author表放在book表上面

在book表中,创建与author表多对多的关系

class Book(models.Model):

  title = models.CharField(max_length=32)
  price = models.DecimalField(max_digits=5 , decimal_places=2)

  #书籍与出版社是一对多,书是多,出版社是一,外键(子表)建在多的表中,
  #publish 作为一个外键 与Book 表建立一对多关系,默认绑定到Book 的主键id上
  publish = models.ForeignKey(Publish,)

然后生成数据库,注意:如果book表中有数据,直接生成数据,就会报错,因为book表会新增一个author_id 字段,而原来的book表中的数据没有改字段,所以会报错,删除book表中的数据

执行命令 python manage.py makemigrations ,python manage.py migrate,

在数据库会发现新增一张表,book_author,是第三张表 ,一个主键,2个外键,是django自动创建的,现在就可以添加书籍

django多对多表的创建,级联删除及手动创建第三张表

在创建的表里,手动插入数据,,然后绑定book与author的多对多关系,

django多对多表的创建,级联删除及手动创建第三张表

在views视图函数中,,先获取Book表的一个book对象,查看该book关联的作者,就是book_obj.authors.all(),

id =1的这本书,如果没有关联的作者,返回None,如果有作者,就返回一个对象集合,QuerySet数据类型,里面包含了关联的作者对象

#给第三张表添加关系,
  #看下authors对象

  book_obj = Book.objects.get(id=1)#获取一个书籍的对象,有可能是多个作者写的,是一个集合对象,

  #获取id=1 这本书的作者集合对象,类似列表结构
  print(book_obj.authors) #gu_orm.Author.None ,是id=1的这本书,没有作者,所以得到一个None,-----------------------------
  #如果给Book和author绑定了关系,添加值,就会得到一个Queryset集合,
  print(book_obj.authors.all())
  #< QuerySet[ < Author: egon >, < Author: alex >, < Author: yuan >] >---------------------------------------

---------------

方法1:多对多关系的创建,获取一个个对象,添加

现在用代码实现多对多关系的创建

先删除原第三张表的数据,

步骤1 ,先得到一个Book对象

book_obj = Book.objects.get(id=1)#获取一个书籍的对象,有可能是多个作者写的,是一个集合对象,

步骤2 :获取1个或2个以上author对象

author1 = Author.objects.get(id=1)
 author2 = Author.objects.get(id=2)

步骤3: 把author1,和author2 添加到 book_obj 对象中,使用add方法,书对象关联的作者表,添加2个作者对象

#book表与author表绑定关系,把2个作者对象添加到,关联到Book对象
  book_obj.authors.add(author1,author2)

然后再执行url,刷新数据库

django多对多表的创建,级联删除及手动创建第三张表

===

方法2:多对多关系的创建,获取所有的对象集合,添加 ,记得用 * 号,把列表拆开,一个个的获取对象

#先获取一个book对象,
book_obj = Book.objects.get(id=1)

#方法2 ,把所有的author加到book对象中
  author_list = Author.objects.all()
  book_obj.authors.add(*author_list)

=====

解除关联关系clear()清除所有的关系 ,remove()删除指定的关系

#解除关联关系
  book_obj.authors.clear()#解除了书与作者的所有关系,

  #指定删除Book与作者的关系,先获取要解除关联的对象,然后用remove的方法,
  author = Author.objects.get(name = 'alex')

  book_obj.authors.remove(author)

----

级联删除,删除一个对象,相关联的一对多,多对多关系都会删除,delte()

book_obj.delete()

----

manytomany 是django自己会生成第三张表,

自己手动也可以创建第三张表

#  manytomany,会自动生成第三张表,现在自己可以手动创建第3张表,

class book2author(models.Model):

  book = models.ForeignKey("Book")
  author = models.ForeignKey("Author")

数据库中就多出book2author这张表

在views视图函数添加一条记录

#----给自己手动创建的第三张添加记录,实列化对象,用save保存
  b2a = book2author(book_id=2,author_id=1)#括号里面可以写集合,作者的集合对象,进行关联,
  b2a.save()
  return HttpResponse('ok')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中optionParser模块的使用方法实例教程
Aug 29 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
详解python pandas 分组统计的方法
Jul 30 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
python神经网络 使用Keras构建RNN训练
May 04 Python
Python  序列化反序列化和异常处理的问题小结
Dec 24 Python
django 中QuerySet特性功能详解
Jul 25 #Python
对Python _取log的几种方式小结
Jul 25 #Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 #Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 #Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 #Python
Python 3.8 新功能全解
Jul 25 #Python
python3.7 的新特性详解
Jul 25 #Python
You might like
PHP脚本的10个技巧(2)
2006/10/09 PHP
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
Web开发之JavaScript
2012/03/29 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
Python Property属性的2种用法
2015/06/21 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
python3获取url文件大小示例代码
2019/09/18 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
化工机械应届生求职信
2013/11/04 职场文书
怎么写有吸引力的自荐信
2013/11/17 职场文书
工程质量月活动方案
2014/02/19 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
2014年转正工作总结
2014/11/08 职场文书
北京颐和园导游词
2015/01/30 职场文书