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 相关文章推荐
Django小白教程之Django用户注册与登录
Apr 22 Python
python 类详解及简单实例
Mar 24 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
python IDLE添加行号显示教程
Apr 25 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
Jun 05 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
python实现代码审查自动回复消息
Feb 01 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循环table实现一行两列显示的方法
2015/06/04 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
JavaScript中的闭包原理分析
2010/03/08 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
python实现关键词提取的示例讲解
2018/04/28 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
java关于string最常出现的面试题整理
2021/01/18 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
经典c++面试题六
2012/01/18 面试题
最新计算机专业自荐信
2013/10/16 职场文书
应届生煤化工求职信
2013/10/21 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
一月红领巾广播稿
2014/02/11 职场文书
大学生就业求职信
2014/06/12 职场文书
红色旅游心得体会
2014/09/03 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
十二生肖观后感
2015/06/12 职场文书
python实现过滤敏感词
2021/05/08 Python
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers